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

How to get Heroku to recognize a yarn.lock or package.json within a subdirectory (not root)

我有一个 Rails 应用程序,在客户端使用 React、Webpack 和 Yarn。我在 /client 目录中拥有与客户端相关的所有内容。这包括我的 yarn.lock 和 package.json 文件。我有一个 Procfile,它可以 cds 到 /client 并正确运行 yarn run build。这在本地工作没有错误。但是,当我 deploy/push 到 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 文件?

还是导致此错误的原因完全不同?

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

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

确保同时使用 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

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

在我的例子中(rake assets:precompile 调用 yarn 并失败),出于某种原因,当构建包进入 ruby -> node 时,Heroku 在尝试 [= =23=] rake 任务,然后我们去 kablooie。

希望对您有所帮助。

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

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

  2. 使用npm

    a) yarn.lock 应该删除

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

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

我将为文档添加另一个可能的答案 use-case。我经历过类似的事情,多个 buildpacks,我已经检查了所有答案中的所有内容:

  • node-js 首先在 .buildpacks 文件中声明
  • 在项目的根目录中添加了一个yarn.lock
  • package.json
  • 引擎下声明的 yarn 依赖项

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


升级buildpack的最新版本解决我的问题:

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

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

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

Check more information here