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

时间:2017-03-25 21:06:06

标签: ruby-on-rails heroku procfile yarnpkg

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

或者这个错误的原因是什么呢?

6 个答案:

答案 0 :(得分:12)

确保同时使用ruby和node buildpack。当我没有时,我收到了这个错误。

在根文件夹中执行以下操作:

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

答案 1 :(得分:9)

我自己也经历过类似的事情。您需要订购构建包,以便节点是第一个。如果yarn.lock在你的根目录中(或者纱线在你的“引擎”键中,就像在@ remydib的答案中那样),那么节点buildpack将安装yarn然后你的包。如果您在/ client中有一个yarn.lock,请将其中一个放在root用户中,然后向其中添加一个postinstall脚本,其中显示cd client && yarn run build

在我的情况下(rake资产:预编译调用yarn和failed),由于某种原因,当buildpacks为ruby时 - >在尝试运行rake任务之前,Heroku不会等待节点安装,我们去kablooie。

希望这有帮助。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

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

  2. 使用npm

    a)应删除yarn.lock

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

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

答案 4 :(得分:0)

我将为文档添加另一个可能的用例的答案。我经历了类似的,多个buildpacks,我检查了所有答案中的所有内容:

  • node-js.buildpacks档案
  • 中首先被宣布
  • 在项目的根目录中添加了yarn.lock
  • package.json
  • 上的引擎下声明的纱线依赖关系

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

将buildpack的最新版本改为解决我的问题:

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

答案 5 :(得分:0)

你可以通过添加其中一个来保存package.json和yarn.lock .slugignore。

它的作用类似于.gitignore - 它只是定义要忽略哪些文件推送到Heroku。

Check more information here