如何让 Heroku 安装 devDependencies?

Posted

技术标签:

【中文标题】如何让 Heroku 安装 devDependencies?【英文标题】:How can I make Heroku install devDependencies? 【发布时间】:2014-05-22 04:43:16 【问题描述】:

我希望 Heroku 在我推送后构建我的应用程序,这样我就不必每次进行更改时都向上推送构建文件夹。然而 Heroku 只安装来自 package.json 和 grunt(我的构建工具)的依赖项,它的所有组件都在 devDependencies 中。我想把它们留在它们所属的地方。这里有什么解决方法?

【问题讨论】:

你能使用这样的自定义构建包吗? github.com/gcpantazis/heroku-buildpack-php-gruntjs 【参考方案1】:

更新:正如 cmets 中所指出的,这不再需要,因为自 2018 年以来,heroku changed its default behaviour 和 dev 依赖项已自动安装

原始答案

Heroku 默认只安装生产依赖,忽略devDependencies 下的开发依赖。

将 npm 生产变量设置为 false 即可:

heroku config:set NPM_CONFIG_PRODUCTION=false

更多信息请访问Heroku Node.js Support page。

【讨论】:

这会将您的 NODE_ENV 设置为开发,这可能会减慢您的应用程序。 @unblevable 我不这么认为:``` -----> 检测到 Node.js 应用程序 -----> 创建运行时环境 NPM_CONFIG_LOGLEVEL=error NPM_CONFIG_PRODUCTION=false NODE_ENV=production NODE_MODULES_CACHE =真``` 我做了 heroku config:set NPM_CONFIG_PRODUCTION=false 并重新启动了 dyno 并且开发依赖项仍然无法安装 @croraf 你好像不熟悉heroku CLI devcenter.heroku.com/categories/command-line 如何在 heroku-prebuild 中执行此操作,以便将流程保持在 PRODUCTION 中?我想我可以在那里调用一个 bash 脚本和 set 它,但它不会以这种方式安装 devdeps。【参考方案2】:

KeepingNPM_CONFIG_PRODUCTIONtrue,我用过Heroku's script hooks:

"scripts": 
  ...
  "heroku-prebuild": "export NPM_CONFIG_PRODUCTION=false; export NODE_ENV=; NPM_CONFIG_PRODUCTION=false NODE_ENV=development npm install --only=dev --dev",
  "heroku-postbuild": "export NPM_CONFIG_PRODUCTION=true; export NODE_ENV=production;",
   ...
,

(终于)为我工作了。

【讨论】:

【参考方案3】:
scripts": 
  ...
  "heroku-prebuild": "npm install --only=dev"

这对我来说已经足够了。感谢 PixnBits 提供有关 heroku-prebuild 的提示。 另外 - 我的问题是通天塔。我最终将 babel-preset-es2015 和其他预设移动到依赖项中,否则 babel 会抱怨预设。

更新:2017 年 8 月 11 日我遇到了这个问题。似乎事情发生了变化(npm 现在是 5.3)。但我看到的是 heroku-prebuild 脚本正在运行,然后安装后脚本正在运行(但我只是试图安装-dev)。

所以我一直在做的就是运行:

heroku config:set NPM_CONFIG_PRODUCTION=false

然后就这样设置好了。我想要一个更好的解决方案。

【讨论】:

这对在子目录中安装依赖项有用吗?假设您在嵌套的客户端文件夹中有一个 package.json【参考方案4】:

要卸载依赖项,您需要执行这些操作

    更新 NPM_CONFIG_PRODUCTION

    heroku 配置变量集

    NPM_CONFIG_PRODUCTION=false

    添加heroku-prebuild:

    scripts": 
      ...
      "heroku-prebuild": "npm install"
    
or

    scripts": 
      ...
      "heroku-prebuild": "npm install --only=dev"
    

【讨论】:

【参考方案5】:

你可以在你的构建脚本 "build": "npm install --only=dev" 中使用它,以防你仍然想要执行更多操作,例如使用 babel 编译你的代码,你可以做这样的事情 "build": "npm install --only=dev && babel src --out-dir dist --copy-files"

【讨论】:

【参考方案6】:

自 2018 年 3 月 1 日起 Heroku installs devDependencies by default,然后在构建步骤完成后修剪它们:

默认情况下,Heroku 将安装列出的所有依赖项 package.jsondependenciesdevDependencies 下。

运行安装和构建步骤后 Heroku 将删除 在部署之前在devDependencies 下声明的包 申请。

Heroku 使用锁定文件,package-lock.jsonyarn.lock, 安装预期的依赖树,所以一定要检查那些 文件到 git 中以确保相同的依赖版本 环境。

Link

【讨论】:

他们可能会这么说,但在 2021 年尝试接受的答案对我还是有用的:/【参考方案7】:

我发现这非常令人困惑。尽管 Heroku 说他们的 default since 2018 是安装所有依赖项,但他们也将环境变量 NODE_ENV=production 设置为 default。这很好,因为它导致/允许修剪,但它很糟糕,因为它意味着NPM will not install devDependencies。

为了避免这种情况而不会弄乱环境变量及其可能的副作用,我们可以将--production=false 附加到 npm,它将安装依赖项和 devDependencies。

在我们的例子中,package.jsonscripts 中我们有一行:

"install": "npm i --prefix ... --production=false"

我的回答与上面的其他人类似,附加的参考资料似乎可以解释为什么它在默认情况下实际上并没有像 Heroku 建议的那样工作。

【讨论】:

以上是关于如何让 Heroku 安装 devDependencies?的主要内容,如果未能解决你的问题,请参考以下文章

在 Heroku 上安装 PyODBC 时找不到 sql.h

如何让我在 Heroku 上的 Laravel 项目使用 Heroku Postgres?

Heroku:如何让它访问多个 .js 文件

Heroku + node.js:我有一个使用多个端口的服务器。如何让 Heroku 分配它们?

如何让 heroku 使用 DB 的环境配置

如何让 South 在 Heroku 中为 Django 应用程序工作