【问题标题】:Get version number from package.json in React Redux (create-react-app)从 React Redux 中的 package.json 获取版本号(create-react-app)
【发布时间】:2018-02-09 05:16:21
【问题描述】:

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

未找到模块:您尝试导入 ./../../package.json 不属于项目 src/ 目录。不支持 src/ 之外的相对导入。你可以 要么将它移到 src/ 中,要么从项目的 node_modules/.

【问题讨论】:

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

标签: node.js reactjs npm react-redux create-react-app


【解决方案1】:

在不导入 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),尽管我没有在任何地方看到它。
【解决方案2】:

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

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(任何其他包也这样做)。
  • 可能是的,如果您将其捆绑到应用程序中,则用户可以访问它。这不是最疯狂的泄漏,但仍然是泄漏
【解决方案3】:

试试这个。

// 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_ 环境变量以公开选定的设置数据,而不是设置本身。
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    导入包.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'};在.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 的维护者并获得访问权限并在代码中添加一个比特币矿工,然后所有大网站的查看者都会为你挖掘比特币......它可能不是和我说的一模一样,但它确实发生过,你可以谷歌它
    猜你喜欢
    • 2022-01-19
    • 2017-07-02
    • 1970-01-01
    • 2019-08-03
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 2022-10-17
    相关资源
    最近更新 更多