在Heroku上部署使用Node.js而不是Sprockets的Rails应用的方法是什么?

我认为你想使用sprockets组装资产,因为它很繁琐,而且你希望使用最新的JS技术如babel和webpack来使用nodejs。

如果能简单地解决,那就将 gulp build 的内容添加到 git 仓库中,但是当行为异常时,我不确定是出现了 bug 还是源代码没有正确地通过 git-add 提交,也许是因为旧的代码造成的。这让我感到很不好。最好能够在部署时进行构建。

由于在将这种管理assets的Rails应用程序部署到Heroku时遇到了很多问题,所以我将这种方法作为备忘录记录下来。

请确保bundle安装rails_12factor。

好像在Heroku上运行Rails是必需的,虽然Node.js无关紧要。

gem "rails_12factor", :group => :production

指定使用Ruby和Node.js的buildpack。

由于Heroku需要Ruby和Node.js,所以我们会指定两个buildpack。

heroku create --buildpack https://github.com/heroku/heroku-buildpack-ruby.git APP_NAME
heroku buildpacks:add https://github.com/heroku/heroku-buildpack-nodejs.git

过去,如果要在一个应用中指定多个buildpack,需要使用multi-buildpack,但最近只需使用buildpacks:add就可以了,不会有问题。

NPM_CONFIG_PRODUCTION=false can be paraphrased in Chinese as “设置NPM_CONFIG_PRODUCTION为false”.

在使用Rails开发时,可以通过安装package.json中指定的包来进行开发。如果在Rails中使用gulp等工具,这些工具只用于开发,因此希望将它们放入devDependencies。然而,由于默认情况下nodejs buildpack只安装dependencies,因此直接安装可能会出现问题。

有一种避免方法就是将所有的依赖都放在一起,但是这样感觉不好,所以我们可以设置环境变量NPM_CONFIG_PRODUCTION=false来代替。

heroku config:set NPM_CONFIG_PRODUCTION=false

通过这样做,devDependencies 和 dependencies 两者都将被安装。

在postinstall中进行全部构建

使用nodejs buildpack时,git-push时会自动执行npm install。然后考虑执行heroku run gulp build,但构建结果没有持久化,导致引用错误。在heroku run中输出文件也会消失吗?因为我对Heroku不太了解,所以不清楚。

为了避免这个问题,我将在 postinstall 脚本中设置为通过 npm install 来生成所有内容。

{
  "scripts": {
    "postinstall": "node_modules/.bin/bower install && node_modules/.bin/gulp build"
  }
}

我正在执行 bower install,但只有这个命令不会使 bower_components 目录下的内容持久保存。

将生成文件的目录全部添加到 cacheDirectories 中。

在未指定cacheDirectories的目录中生成的文件,不管是否在npm install过程中,都会被删除。

{
  "cacheDirectories": [
    "bower_components",
    "node_modules"
  ]
}

总而言之

只需进行正确的配置,就可以在Heroku上使用通过gulp构建的文件。