ChatGPT解决这个技术问题 Extra ChatGPT

从 React Redux 中的 package.json 获取版本号(create-react-app)

OP 编辑:如果其他人遇到此问题:该应用程序是使用 create-react-app 创建的,这将导入限制在 src 文件夹内。但是,如果您upgrade react-scripts to v1.0.11,它确实允许您访问 package.json。

我正在尝试从我的应用程序中的 package.json 获取版本号。

我已经尝试过 these suggestions,但它们都没有工作,因为我无法从 src 文件夹外部访问 package.json(可能是由于 React,我是新手)。将 package.json 移动到 src 意味着我无法从我的根文件夹运行 npm installnpm version minornpm run build。我试过使用 process.env.npm_package_version 但这会导致未定义。

我正在使用 Jenkins,我还没有设置它来推送提交,但我唯一的想法是从 GitLab 中的标签中获取版本,但我不知道该怎么做,它会给回购添加不必要的依赖,所以我真的很想找到一个替代方案。

编辑:我的文件结构是这样的:

--> RootAppFolder
    |--> build
    |--> node_modules
    |--> public
    |--> src
         |--> Components
              |--> Root.js
    |
    |--> package.json

因此,要从 Root.js 访问 package.json,我必须执行 import packageJson from './../../package.json',然后出现以下错误:

./src/components/Root.js 未找到模块:您尝试导入项目 src/ 目录之外的 ./../../package.json。不支持 src/ 之外的相对导入。你可以将它移到 src/ 中,或者从项目的 node_modules/ 中添加一个符号链接。

你也试过es6版本吗?
“我无法从 src 文件夹外部访问 package.json”——你能解释一下吗?如果可以访问package.json,则可以轻松检索版本号。
@kenfire 你是什么意思?我对 ES6 不是很熟悉。
@shaochuancs 我已经编辑解释。将 package.json 移动到 src 文件夹可以获取版本,但是我无法运行任何 npm 命令来实际构建和运行应用程序。
@shaochuancs 是的,原来该应用程序是使用 react-create-app 创建的,它通过 webpack 设置了限制。

A
Andrei V

在不导入 package.json 并将其暴露给 create-react-app 的情况下解决此问题

需要:version 1.1.0+ of create-react-app

.env

REACT_APP_VERSION=$npm_package_version
REACT_APP_NAME=$npm_package_name

index.js

console.log(`${process.env.REACT_APP_NAME} ${process.env.REACT_APP_VERSION}`)

注意:版本(和许多其他npm config params)可以访问

注意 2:.env 文件的更改只有在您restart the development server之后才会被选中


我必须在存储库根目录中创建 .env(作为纯文本文件)才能使其工作。喜欢它
@JoeMaffei 这是一个很好的解决方案,但是用 import { name, version } from "../package.json"; 引用 package.json 文件不那么神秘,并且不需要创建 .env 文件。
@TheDarkIn1978 但它不适用于 Create React App,因为它不允许在 src/ 之外引用。
更改 .env 后不要忘记再次npm start
刚刚发现 .env 文件中的 NEXT_PUBLIC_APP_VERSION=$npm_package_version 也适用于 next.js(我使用的是 9.5.3),尽管我没有在任何地方看到它的文档。
k
kenfire

根据您的编辑,我建议尝试:

import packageJson from '/package.json';

您也可以尝试创建符号链接:

# From the project root.
cd src; ln -s ../package.json package.alias.json

列出 src 目录的内容,您将看到符号链接。

ls
#=> package.alias.json -> ../package.json

添加 .alias 有助于减少对他人和未来自己的“魔力”。另外,它将帮助文本编辑器将它们分开。你以后会感谢我的。只需确保将 JS 代码更新为从 ./package.alias.json 而不是 ./package.json 导入即可。

另外,请看一下这个问题:The create-react-app imports restriction outside of src directory


虽然导入仍然不起作用,但我没有意识到该应用程序是使用 create-react-app 创建的,这正是问题所在。所以我想解决方案是查看 webpack 并自己配置它并摆脱这个限制。
正如 OP 在编辑他们的问题中提到的那样,这不再是必要的。较新版本的 react-scripts 允许您从 src 外部导入。
将 package.json 添加到你的包不是一个好主意。它会将你所有的依赖暴露给潜在的攻击者,而且它是一个相当大的对象,你需要的数据只有几个字节。
@EricBurel 在引用 RN 包时也适用吗?在发布我的包时,我已经公开了 package.json(任何其他包也这样做)。
谁在乎是否有人反编译了应用程序并看到它使用了任何库?为什么这是一个安全问题?防止人们反编译您的代码的唯一方法是一开始就不要发布二进制文件。
V
Vorathep Sumetphong

尝试这个。

// in package.json
"version": "1.0.0"

// in index.js
import packageJson from '../package.json';
console.log(packageJson.version); // "1.0.0"

使用 Expo,这对我来说就像一个魅力。我调用了我的 appJson,所以它是 console.log(appJson.expo.version);。谢谢!
这将在你的包中导入整个 package.json
@inferus-vv 你可以import { version } from '../package.json';
不安全!你不想将你的 package.json 暴露给用户和黑客
@TeodorCiuraru,是的。看看 create-react-app.dev/docs/adding-custom-environment-variables/… React lib 有一个机制。定义 REACT_APP_;环境变量以公开选定的设置数据,但不公开设置本身。
f
f.jafari

我不认为通过'import'或'require'包获取版本是正确的。您可以在 package.json 中添加脚本

"start": "REACT_APP_VERSION=$npm_package_version react-app-script start",

您可以通过任何 js 文件中的“process.env.REACT_APP_VERSION”来获取它。

它也适用于构建脚本,如下所示:

"build": "REACT_APP_VERSION=$npm_package_version react-app-script build",

T
Tom Chen

导入包.json

一般来说,导入 package.json 并不好。原因:安全&捆绑大小问题

是的,最新的 webpack(默认配置)+ ES6 importimport packageJson from '../package.json'import { version } from '../package.json' 进行了 tree-shaking(即只包括 "version" 值而不是整个 package.json)。但不能保证您是否使用 CommonJS (require()),或者更改了您的 webpack 配置,或者使用其他捆绑器/转译器。依靠 bundler 的 tree-shaking 来隐藏你的敏感数据是很奇怪的。如果您坚持导入 package.json 但不想暴露整个 package.json,您可能需要添加一些构建后检查以确保删除 package.json 中的其他值。

然而,对于 package.json 毕竟是公开的开源项目来说,这里的安全问题仍然是理论上的。如果安全性和捆绑包大小都没有问题,或者,非保证的 tree-shaking 对你来说已经足够好了,那么继续)

.env

.env方法,如果行得通,那就很好,但如果你不使用create-react-app,你可能需要安装dotenv并做一些额外的配置。还有一个小问题:不建议提交 .env 文件(herehere),但如果您执行 .env 方法,看起来您将不得不提交文件 因为它可能对您的程序运行至关重要。

最佳实践(可以说)

(这主要不是用于 create-react-app,但您仍然可以使用 react-app-rewiredeject cra 来在 cra 中配置 webpack

如果您使用 webpack,那么使用 DefinePlugin

plugins: [
  new webpack.DefinePlugin({
    'process.env.VERSION': JSON.stringify(
      process.env.npm_package_version,
    ),
  }),
]

您现在可以在前端程序(开发或生产)中使用 console.log(process.env.VERSION)

(您可以简单地使用 VERSION 而不是 process.env.VERSION,但它通常需要额外的配置来满足 linter:在 .eslintrc (doc) 中添加 globals: {VERSION: 'readonly'};在 TypeScript 的 .d.ts 文件中添加 declare var VERSION: string;

虽然它是“npm_package_version”,但它也适用于 yarn。这是a list of npm's exposed environment variables

其他捆绑程序可能具有类似的插件,例如 @rollup/plugin-replace


这是一个冗长且非常有用的答案,谢谢! :) 假设我已经将 package.json 与我的应用程序捆绑在一起,那么安全问题是什么?
@NikitaMalyschkin 如果您已经将整个 package.json 包含在您的生产代码中,那么当您为版本号导入它时就没有额外的问题了。但是您可能希望首先修改包含整个 package.json 的决定。
每个人都包含在 package.json 中的“敏感信息”是什么?我见过的每一个 package.json 都只是一个无聊的依赖项和版本号列表。谁在乎是否有人通过反编译应用程序看到它?我没有看到仅导入 package.json 的安全问题。没有人解释这个所谓的安全问题是什么,每个人都只是说它存在。
@AndrewKoster 如果它是一个开源项目,那么就没有这样的担忧。如果它是私有的,那么依赖列表和其他配置可能会揭示项目所有者不想公开的内容。例如,如果发现了依赖项的漏洞,黑客就更容易发起一些所谓的 0-day 攻击。
@AndrewKoster 黑客也有可能找到一种方法来更改已知的上游依赖项以攻击下游依赖项和应用程序。例如,你知道一个大网站正在使用库 A,你“社会工程师”库 A 的维护者并获得访问权限并在代码中添加一个比特币矿工,然后所有大网站的查看者都会为你挖掘比特币......它可能不会和我说的一模一样,但它确实发生过,你可以谷歌它
R
Rizwan

打开您的 package.json 文件并更改此行

问题是:

// 在 package.json "scripts": { "dev": "REACT_APP_VERSION=local REACT_APP_VERSION_NUMBER=$npm_package_version react-scripts start", ... }

解决方案是

// 在 package.json "scripts": { "dev": "react-scripts start", ... }