如何让Heroku安装devDependencies?

56

我希望在每次提交代码后,Heroku能够构建我的应用程序,这样我就不必每次更改时都上传build文件夹了。但是Heroku只会从package.json中安装依赖项,而grunt(我的构建工具)及其组件则位于devDependencies。我希望将它们保留在那里。这里有什么解决办法吗?


1
你能使用类似这样的自定义 Buildpack 吗?https://github.com/gcpantazis/heroku-buildpack-php-gruntjs - catsby
7个回答

95

更新: 如评论中所指出的,此操作已不再需要,因为从2018年开始,Heroku更改了其默认行为,会自动安装开发依赖项。

原始回答

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

将npm的production变量设置为false即可解决问题:

heroku config:set NPM_CONFIG_PRODUCTION=false

请访问Heroku Node.js支持页面获取更多信息。


3
这会将您的NODE_ENV设置为开发模式,可能会减慢应用程序的速度。 - unblevable
7
@unblevable 我不这么认为:``` -----> 检测到 Node.js 应用程序 -----> 创建运行环境 NPM_CONFIG_LOGLEVEL=error NPM_CONFIG_PRODUCTION=false NODE_ENV=production NODE_MODULES_CACHE=true - bithavoc
2
我执行了 heroku config:set NPM_CONFIG_PRODUCTION=false 然后重新启动了 dyno,但开发依赖仍无法安装。 - Lev
4
如何在Heroku预构建中完成此操作以便将进程保持在生产环境中?我认为我可以调用一个Bash脚本并在那里进行设置,但是这种方式无法安装开发依赖项。 - roberto tomás
2
如果有人在使用yarn时看到这条消息,相应的等价命令是YARN_PRODUCTION=false - kylesimmonds
显示剩余4条评论

19

保持 NPM_CONFIG_PRODUCTION true,我使用了Heroku的脚本钩子

"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;",
   ...
},

最终对我有用了。


1
我不知道这是不是npm版本的问题,但对我来说,使用不同的标志:npm install --production=false可以解决上述问题。 - Moshisho

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

这对我足够了。感谢PixnBits提供的关于heroku-prebuild的提示。 另外-我的问题与babel有关。最终,我将babel-preset-es2015和其他预设项移动到依赖项中,否则babel会抱怨预设项。
更新:2017年8月11日,我一直在遇到问题。似乎事情已经发生了变化(npm现在是5.3)。但是我看到的是heroku-prebuild脚本被运行,然后运行post-install脚本(但我只想安装-dev)。
所以我一直在做的就是运行:
heroku config:set NPM_CONFIG_PRODUCTION=false

请保持原样设置。我希望有更好的解决方案。


1
这个方法适用于在子目录中安装依赖吗?假设你有一个嵌套在客户端文件夹中的 package.json。 - Ridhwaan Shakeel

1
我发现这非常令人困惑。尽管Heroku表示自2018年起他们的默认设置是安装所有依赖项,但他们也默认设置了环境变量NODE_ENV=production。这是好的,因为它导致/允许修剪,但它也意味着NPM不会安装devDependencies
为了避免这种情况而不影响环境变量和可能产生的副作用,我们可以在npm后面添加--production=false,这样它将安装依赖项和devDependencies。
在我们的情况下,在package.json中的scripts中有一行:
"install": "npm i --prefix ... --production=false"

我的回答与其他人的类似,但还附加了一些参考资料,似乎可以解释为什么它并没有像Heroku建议的那样默认工作。

1

要卸载依赖项,您需要执行以下操作:

  1. 更新 NPM_CONFIG_PRODUCTION

    heroku 配置变量设置

    NPM_CONFIG_PRODUCTION=false

  2. 添加 heroku-prebuild:

    scripts": {
      ...
      "heroku-prebuild": "npm install"
    }

or

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


1

自2018年3月1日起,Heroku默认安装devDependencies,然后在构建完成后进行修剪:

默认情况下,Heroku将安装在dependenciesdevDependencies下列出的所有依赖项。

运行安装和构建步骤后,Heroku将删除在devDependencies下声明的软件包,然后部署应用程序。

Heroku使用锁定文件,即package-lock.jsonyarn.lock,来安装预期的依赖树,请确保将这些文件提交到git中,以确保在各个环境中使用相同的依赖版本。

链接


他们可能会这样说,但在2021年,尝试采纳的答案对我仍然有效 :/ - Ronald C

1

你可以在构建脚本中使用这个命令 "build": "npm install --only=dev",如果你还想执行其他操作,比如用babel转译你的代码,你可以像这样做 "build": "npm install --only=dev && babel src --out-dir dist --copy-files"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接