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

IT技术 node.js reactjs npm react-redux create-react-app
2021-04-12 23:40:50

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

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

我已经尝试过这些建议,但它们都没有奏效,因为我无法从 src 文件夹外部访问 package.json(可能是由于 React,我是新手)。移动的package.json到SRC那么意味着我不能跑npm installnpm version minornpm run build从我的根文件夹。我试过使用,process.env.npm_package_version但结果未定义。

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

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

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

所以要从 Root.js 访问 package.json 我必须这样做import packageJson from './../../package.json',然后我收到以下错误:

./src/components/Root.js

未找到module:您试图导入 ./../../package.json ,该文件位于项目 src/ 目录之外。不支持 src/ 之外的相对导入。您可以将其移动到 src/ 中,也可以从项目的 node_modules/ 中向其添加符号链接。

5个回答

解决这个问题而不导入和暴露package.jsoncreate-react-app

需要:create-react-app 1.1.0+ 版本

.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 配置参数

注意 2:.env只有在您重新启动开发服务器后才会选择文件的更改

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

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

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 代码以导入 from./package.alias.json而不是./package.json.

另外,请看一下这个问题: src 目录之外的 create-react-app 导入限制

虽然导入仍然不起作用,但我没有意识到应用程序是使用 create-react-app 创建的,这就是问题的来源。所以我想解决方案是研究 webpack 并自己配置它并摆脱这个限制。
2021-05-23 23:40:50
正如 OP 在对其问题的编辑中提到的那样,这不再是必要的。的较新版本react-scripts允许您从src.
2021-05-31 23:40:50
可能是的,如果您将其捆绑到应用程序中,则用户可以访问它。这不是最疯狂的泄漏,但仍然是泄漏
2021-06-02 23:40:50
将 package.json 添加到您的包中并不是一个好主意。它会将您的所有依赖项暴露给潜在的攻击者,而且它是一个相当大的对象,您需要的数据只有少数几个字节。
2021-06-03 23:40:50
@EricBurel 在提到 RN 包时是否也适用?我在发布我的包时已经公开了 package.json(任何其他包也这样做)。
2021-06-04 23:40:50

试试这个。

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

// in index.js
import packageJson from '../package.json';
console.log(packageJson.version); // "1.0.0"
不安全!您不想将 package.json 暴露给用户和黑客
2021-05-29 23:40:50
使用 Expo,这对我来说就像一种魅力。我打电话给我的 appJson,所以它是console.log(appJson.expo.version);. 谢谢!
2021-05-31 23:40:50
@inferus-vv 你可以 import { version } from '../package.json';
2021-05-31 23:40:50
这将在您的包中导入整个 package.json
2021-06-03 23:40:50
@TeodorCiuraru,是的。看看create-react-app.dev/docs/adding-custom-environment-variables/... React lib 有一个机制。定义 REACT_APP_<SOMETHING> 环境变量以公开选定的设置数据,但不公开设置本身。
2021-06-05 23:40:50

我认为通过 '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",

导入 package.json

一般来说,进口package.json不好原因:安全和包大小问题

是的,最新的WebPack(默认配置)+ ES6import确实树摇动(即只包括"version"值,而不是整个package.json)两个import packageJson from '../package.json'import { version } from '../package.json'但是如果你使用 CommonJS ( require()),或者已经改变了你的 webpack 配置,或者使用了其他的 bundler/transpiler ,就不能保证了依靠捆绑程序的摇树来隐藏您的敏感数据很奇怪。如果您坚持导入package.json但不想package.json暴露整个内容,您可能需要添加一些构建后检查以确保package.json删除其他值

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

.env

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

最佳实践(可以说)

(这不是主要用于create-react-app,但您仍然可以使用react-app-rewired弹出 cra以便webpack在 cra 中进行配置

如果您使用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,但它通常需要额外的配置,以满足棉短绒:附加globals: {VERSION: 'readonly'}.eslintrcDOC);附加declare var VERSION: string;.d.ts文件typescript)

尽管它是“ npm _package_version”,但它也适用yarn是 npm 公开的环境变量的列表

其他打包器可能有类似的插件,例如@rollup/plugin-replace

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