【问题标题】:Running npm scripts conditionally有条件地运行 npm 脚本
【发布时间】:2013-09-16 23:34:26
【问题描述】:

我有 2 个主要的构建配置 - dev 和 prod。 我将更新推送到运行 npm install --production 以安装我的应用程序的 heroku 服务器。 在 package.json 我有以下部分:

"scripts": {
    "postinstall": "make install"
}

运行一个负责丑化代码和其他一些小事情的 make 文件。

但是,我不需要在开发模式下运行这个 makefile。有什么方法可以有条件地使用 npm 运行脚本?..

谢谢!

【问题讨论】:

    标签: node.js heroku npm


    【解决方案1】:

    您可以在package.json 中定义类似的内容(我相信if 语句有更好的简写方式。)

    "scripts": {
        "postinstall":"if test \"$NODE_ENV\" = \"production\" ; then make install ; fi "
    }
    

    然后,当您使用生产标志执行 npm 时,就像您所说的那样,您已经这样做了

    npm install --production
    

    它将执行您的make install,因为它将设置$NODE_ENV = production


    当我需要有条件地执行某些任务时,我将环境变量传递给脚本/程序,它负责处理该逻辑。我像这样执行我的脚本

    NODE_ENV=dev npm run build
    

    package.json 中,您将启动一个脚本/程序

    "scripts": {
        "build":"node runner.js"
    }
    

    它将检查环境变量的值以确定要做什么。在runner.js 中,我执行以下操作

    if (process.env.NODE_ENV){
      switch(process.env.NODE_ENV){
        ....
      }
    }
    

    【讨论】:

    • 如您所见,也可以更简洁地执行条件:"postinstall": "if [ test = \"production\" ]; then make install; fi"
    • 是跨平台的吗?
    • @SuperUberDuper 不,它不会与 Windows DOS 兼容。它必须根据运行 npm 脚本的平台进行相应调整。 DOS 也有条件。
    • 嗨,詹姆斯,这个有条件任务的文档在哪里,因为我找不到它们,我需要做这样的事情 "postinstall":"if test \"$NODE_ENV\" = \ "production\" ; 然后 --env=prod ; else --env=qa fi " 我在 prod 和 qa 之间选择
    • @Milo 条件只是 bash 条件表达式。
    【解决方案2】:

    供日后参考。

    对于条件 npm 脚本,您可以使用跨平台的基本逻辑运算符来创建类似 if 的语句(||&&)。 我遇到需要运行脚本来只在任何机器上生成一次帮助程序。您可以通过使用process.exit() 代码使用内联javascript 来执行此操作。

    "scripts": {
        "build":"(node -e \"if (! require('fs').existsSync('./bin/helpers')){process.exit(1)} \" || npm run setup-helpers) && npm run final-build-step"
    }
    

    所以为了测试envs,你可以这样做:

    "scripts": {
        "build":"node -e \"if (process.env.NODE_ENV === 'production'){process.exit(1)} \" || make install"
    }
    

    【讨论】:

      【解决方案3】:

      您不能在 devDependencies 下的 .json 中添加另一个部分吗?然后,如果您执行 npm install ,它将安装 devDependincies 下指定的软件包,而 npm install --production 将安装常规依赖项。

      【讨论】:

        【解决方案4】:

        我鼓励您采取不同的策略来丑化您的代码。看看connect-browserify 或更强大的asset-rack

        这些可以在 Express 服务器启动时自动丑化您的代码,而不是在安装时。您可以将它们配置为在开发和生产中执行不同的操作。

        【讨论】:

        • 来自connect-browserify github页面:You should never use this middleware in production — use nginx for serving pre-built bundles to a browser.
        • 感谢您的更正。然而,Asset Rack 非常适合在生产环境中使用。
        猜你喜欢
        • 2019-10-14
        • 2022-08-23
        • 1970-01-01
        • 2018-10-10
        • 2013-09-02
        • 1970-01-01
        • 2022-12-21
        • 1970-01-01
        • 2017-01-03
        相关资源
        最近更新 更多