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


86

OP EDIT:如果其他人遇到此问题:该应用程序是使用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中的标签获取版本,但是我不知道如何做到这一点,它会给仓库增加不必要的依赖性,所以我真的很想找到一个替代方案。

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

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

因此,要从Root.js访问package.json,我将import packageJson from './../../package.json'得到以下错误:

./src/components/Root.js

找不到模块:您试图导入./../../package.json,它不在项目src /目录下。不支持src /以外的相对导入。您可以将其移动到src /中,也可以从项目的node_modules /中向其添加符号链接。


您是否也尝试过es6版本?
kenfire,

“我无法从src文件夹外部访问package.json” –您可以对此进行解释吗?如果package.json可以访问,则可以轻松检索版本号。
shaochuancs

@kenfire是什么意思?我对ES6不太熟悉。
Baldeep

@shaochuancs我已编辑解释。将package.json移到src文件夹中可以获取版本,但是后来我无法运行任何npm命令来实际构建和运行该应用程序。
Baldeep

1
@shaochuancs是的,事实证明该应用程序是使用react-create-app创建的,它通过webpack进行了限制。
Baldeep

Answers:


42

根据您的修改,我建议您尝试

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

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


虽然导入仍然无法正常进行,但我没有意识到该应用程序是使用create-react-app创建的,这是问题所在。因此,我想解决的办法是,自己研究webpack并对其进行配置,并摆脱这种限制。
Baldeep

很高兴提供了帮助
kenfire,

1
正如OP在其问题的编辑中提到的那样,这不再是必需的。较新的版本react-scripts允许您从外部导入src
约书亚·品特

4
将package.json添加到包中不是一个好主意。它会将您所有的依赖项暴露给潜在的攻击者,再加上一个相当大的对象,并且您需要的数据仅为几个字节。
Joe Maffei

1
这不应该是可接受的答案,您不应该在客户端版本中加载应用程序设置。查看更多答案,这些答案依赖于在构建时读取的环境变量。
埃里克·伯瑞尔

150

解决这个问题而无需导入并暴露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 config params

注意2:.env仅在重新启动开发服务器后,才会选择对文件所做的更改


6
我必须.env在存储库根目录中创建(作为纯文本文件)才能正常工作。喜欢它
Breaker222 '18

4
@JoeMaffei这是一个很好的解决方案,但是使用引用package.json文件的import { name, version } from "../package.json";隐秘性较低,并且不需要创建.env文件。
矮胖的大块

2
@ TheDarkIn1978但不适用于Create React App,因为它不允许在之外进行引用src/
Onkeltem

5
npm start更改后不要忘记再次.env
ZYinMD

1
刚刚发现NEXT_PUBLIC_APP_VERSION=$npm_package_version在.env文件中,它也适用于next.js(我使用的是9.5.3),尽管我在任何地方都没有看到它的记载。
StephenT

40

尝试这个。

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

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

1
我已经编辑了我的问题,以解释为什么这行不通。
Baldeep

11
这会将整个package.json导入您的包中
inferus-vv

11
您可以使用@ inferus-vvimport { version } from '../package.json';
Stephen Saucier

4
不安全!您不想向用户和黑客公开您的package.json
Alina_Lapina

1
@TeodorCiuraru,是的。看一下create-react-app.dev/docs/adding-custom-environment-variables/…React lib为此提供了一种机制。定义REACT_APP_ <SOMETHING>环境变量以公开选定的设置数据,而不公开设置本身。
Alina_Lapina

19

我认为通过'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",
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.