如何让 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的主要内容,如果未能解决你的问题,请参考以下文章
如何仅将 git 存储库的子目录部署/推送到 Heroku?
Heroku(Cedar) + Node + Express + Jade 子目录中的客户端 javascript 文件在本地与 foreman+curl 一起工作,但在推送到 Heroku 时不能