【问题标题】:How to get the version from the package.json in Typescript?如何从 Typescript 中的 package.json 获取版本?
【发布时间】:2017-04-28 15:55:26
【问题描述】:

我找到了this Q&A

我尝试使用以下方法从 package.json 获取版本:

import { version } from './package.json';

但它会导致:

package.json' has unsupported extension. The only supported extensions are '.ts',
'.tsx', '.d.ts'.

【问题讨论】:

    标签: typescript versioning


    【解决方案1】:

    我喜欢在不使用 Webpack 或任何其他依赖项的情况下为浏览器设计的库执行此操作的方法是将prebuild 脚本添加到package.json,该脚本将版本写入可以在其他地方导入的 TypeScript 源文件。

      "scripts": {
        "prebuild": "node -p \"'export const LIB_VERSION = ' + JSON.stringify(require('./package.json').version) + ';'\" > src/version.ts",
        "build": "tsc",
      }
    

    这将使用以下代码运行节点:

    'export const LIB_VERSION = ' + JSON.stringify(require('./package.json').version) + ';'

    并将输出重定向到src/version.ts

    这导致version.ts 包含:

    export const LIB_VERSION = "1.0.0";

    然后您可以简单地从其他文件中导入和使用它:

    import { LIB_VERSION } from './version';

    您可能希望将 src/version.ts 从源代码控制中排除,这样它的更改就不会乱扔您的更改历史记录!

    【讨论】:

    • 这应该是公认的答案,因为它是迄今为止最好的 Typescript 方式
    • 非常出色。我只建议您将相同的脚本放在preinstall 而不是prebuild 上,这样即使您有多个构建脚本,它也会始终运行。否则你必须在每个构建脚本之前添加npm run prebuild &&
    • 换了版本不重新安装怎么办?许多 CI 脚本会在安装之后和构建之前更新版本。把它放在对你有意义的地方,但对于绝大多数人来说,它会是预先构建的
    • @Tim 这是一个公平的评估。对于一些可能完美工作的人。感谢您将这个脚本放在一起!
    【解决方案2】:

    如果你在commonJS环境中,为什么不简单地使用

    const pj = require('./package.json')
    console.log(pj.version)
    

    编辑

    既然你好像在用 webpack,那就添加合适的 loader

       module: {
        loaders: [
            ...
            {test: /\.json$/, loader: 'json-loader'},
            ....
    

    显然你需要使用npm install安装

    【讨论】:

    • 这行得通,但它也将你整个 package.json 包含到你编译的 javascript 模块中,并将它公开给使用你网站的公众。通过对您使用的所有内容以及您在 package.json 中放置的任何设置进行分类,您正在添加不必要的代码并将您的网站暴露于潜在的漏洞中
    • @Daniel San 1/ 这是对特定问题的回答,而不是安全论文。如果您想阅读某些内容,则需要访问它。 2/ 并非所有应用都是“网站”,不,这不是“完全的安全漏洞”
    • 我希望答案不仅在技术上正确,而且具有常识和良好实践。想象一个新手在做这里所说的事情。这将是一团糟
    • @Daniel San。当然。我谦虚地只回答我被问到的问题,我不是在为新手传福音。但是继续。既然你“知道”,也回答这个问题。想出一个专业而详细的原因为什么这是一个“安全漏洞”和一个更好的方法。像你这样没有论证的笼统陈述是没有帮助的
    • 查看我的答案以获得不那么可怕的版本:stackoverflow.com/a/67701490/106623
    【解决方案3】:

    有多种方法,但我发现最有用的一种是使用 ng-node-environment 包。这会生成一个文件 ./src/environments/base.ts,您可以在 typescript 导入中直接引用该文件。它包含一个名为sharedEnvironment 的常量对象。您的导入行如下所示:import sharedEnvironment from './base';

    当您执行该命令时,它会查找所有以“NG_”开头的环境变量并将它们作为属性添加到sharedEnvironment

    所以,我创建了一个 package.json 脚本来设置变量并执行 ng-node-environment。为了兼容性,我使用 cross-env 使其与平台无关(适用于 windows 和 *nix)

    这是我的 package.json 脚本:-

    "scripts": {
        "version": "cross-env-shell NG_APPVERSION=$npm_package_version node ./node_modules/ng-node-environment/index.js",
        "another" : "echo hello world"
    }
    

    然后运行:npm run version提取版本并放入./src/environments/base.ts

    我现在可以访问属性appversion 并在我的environment.ts 中使用它。

    注意:如果我调用了变量NG_APP_Version,则属性名称将被驼峰式大小写为appVersion

    import sharedEnvironment from './base';
    
    export const environment = {
      production: false,
      logLevel: LogLevel.Error,
      version : sharedEnvironment.appversion,
    };
    

    当然,这样我可以通过在执行ng-node-environment之前设置其他变量来从package.json添加其他值,或者可以通过创建名为NG_<Something>的变量预先添加更多属性,例如:NG_GitBranch、@987654338 @、NG_CliVersion

    在使用 Angular 进行开发并确保它始终保持同步时,我使用启动脚本开始开发:-

    "scripts": {
        "version": "cross-env-shell NG_APPVERSION=$npm_package_version node ./node_modules/ng-node-environment/index.js",
        "start": "npm run version && ng serve"
    }
    

    所以我输入:npm start,它会同步版本号、构建和启动

    【讨论】:

      猜你喜欢
      • 2018-02-06
      • 2021-02-06
      • 2018-02-09
      • 2012-02-27
      • 2020-05-23
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多