如何让 Heroku 识别子目录(不是根目录)中的 yarn.lock 或 package.json

Posted

技术标签:

【中文标题】如何让 Heroku 识别子目录(不是根目录)中的 yarn.lock 或 package.json【英文标题】:How to get Heroku to recognize a yarn.lock or package.json within a subdirectory (not root) 【发布时间】:2017-08-18 17:13:03 【问题描述】:

我有一个在客户端使用 React、Webpack 和 Yarn 的 Rails 应用程序。我在 /client 目录中拥有与客户端相关的所有内容。这包括我的 yarn.lock 和 package.json 文件。我有一个 cd 到 /client 并正确运行 yarn run build 的 Procfile。这在本地有效,没有错误。但是,当我部署/推送到 Heroku 时,我的推送被拒绝并且我收到以下错误:

remote:        cd client && yarn run build:production
remote:        sh: 1: yarn: not found
remote:        rake aborted!
remote:        Command failed with status (127): [cd client && yarn run build:production...]

这对我来说是 Heroku 无法在根级别找到 yarn.lock 文件。如何让 Heroku 使用 /client 目录中的 yarn.lock 文件?

或者这个错误的原因完全是别的什么?

【问题讨论】:

【参考方案1】:

确保同时使用 ruby​​ 和节点构建包。我没有得到这个错误。

在你的根文件夹中执行这些:

heroku buildpacks:set heroku/ruby
heroku buildpacks:add --index 1 heroku/nodejs

来源:https://devcenter.heroku.com/articles/using-multiple-buildpacks-for-an-app

https://github.com/shakacode/react_on_rails/blob/master/docs/additional-reading/heroku-deployment.md

【讨论】:

【参考方案2】:

我自己也经历过类似的事情。您需要订购构建包,以便首先使用节点。如果 yarn.lock 在您的根目录中(或 yarn 在您的“engines”键中,如@remydib 的答案),那么节点 buildpack 将安装 yarn,然后安装您的包。如果您在 /client 中有一个 yarn.lock,请将其放入根目录,然后在其中添加一个 postinstall 脚本,上面写着 cd client && yarn run build

在我的情况下(rake assets:precompile 调用 yarn 并失败),由于某种原因,当 buildpacks 转到 ruby​​ -> node 时,Heroku 在尝试运行 rake 任务之前不会等待 node 安装,而是使用 kablooie。

希望这会有所帮助。

【讨论】:

它有效。但我想知道为什么我们必须把 NodeJS buildpacks 放在首位? @hiveer 需要 NodeJS Buildpack 来确保 node 和 npm/yarn 可用。【参考方案3】:

    使用yarn 安装应用程序的依赖项

    a) yarn.lock 应该存在于 repo 的根目录中。 yarn install b) package-lock.json 应该被删除 git rm package-lock.json

    使用npm

    a) yarn.lock 应该被删除

来源:https://devcenter.heroku.com/articles/ruby-support#installed-binaries

https://docs.npmjs.com/files/package-lock.json

【讨论】:

【参考方案4】:

也许你可以尝试输入 package.json

  "engines": 
    "node": "^6.9",
    "yarn": "^0.21"
  ,

【讨论】:

【参考方案5】:

我将为记录另一个可能的用例添加一个答案。我经历了类似的多个构建包,并且检查了所有答案中的所有内容:

node-js 首先在 .buildpacks 文件中声明 yarn.lock 已添加到项目的根目录中 在package.json 的引擎下声明的纱线依赖关系

尽管如此,yarn 没有使用,因为我使用的是旧版本的 node-js buildpack。


更新 buildpack 的最新版本解决了我的问题:

https://github.com/heroku/heroku-buildpack-nodejs#v118

【讨论】:

【参考方案6】:

您可以同时保留 package.json 和 yarn.lock,方法是将其中之一添加到 .slugignore。

它的工作方式类似于 .gitignore - 它只是定义了哪些文件可以忽略推送到 Heroku。

Check more information here

【讨论】:

以上是关于如何让 Heroku 识别子目录(不是根目录)中的 yarn.lock 或 package.json的主要内容,如果未能解决你的问题,请参考以下文章

如何使用呼叫目录扩展来识别我的应用程序中的来电?

如何让 PROJ C++ 识别网格目录?

如何让 Eclipse 识别来自 SBT 的依赖项

如何仅将 git 存储库的子目录部署/推送到 Heroku?

Heroku(Cedar) + Node + Express + Jade 子目录中的客户端 javascript 文件在本地与 foreman+curl 一起工作,但在推送到 Heroku 时不能

如何将 django/react 应用程序部署到具有不同目录结构的 heroku