我使用的是grunt插件,还有像grunt-contrib-copy
、grunt-contrib-mincss
这样的grunt插件(列为我的应用程序的npm依赖项)。
此外,我没有提交npm_modules
文件夹和public
文件夹,所有生成的文件都在那里。在部署和设置服务器(它已经在寻找public
文件夹)后,我不知道如何构建我的应用程序(我有grunt build
命令)。
我看到了一些类似grunt-heroku-deploy
的东西,但在上传之前提交似乎是个坏主意。也许有一些温和的决定。。。有什么想法吗?
npm支持postinstall
步骤(以及其他许多步骤),这可能正是您想要的。
node.js heroku构建包在您推送到heroku以解决构建依赖关系时运行此命令:
$ npm install --production
https://devcenter.heroku.com/articles/nodejs-support#build-行为
如果您查看npm文档,您可以设置一系列脚本,以便在任何人为您的包运行npm install
之前或之后运行。它配置在package.json
的scripts
属性中。scripts
属性允许在包的生命周期中发生某些事情时运行自定义脚本(包括grunt
)。
例如,要在任何人(包括Heroku)运行npm install
时回显一些文本并运行grunt
命令,请将其添加到您的package.json
:
{
...
"scripts": {
"postinstall": "echo postinstall time; ./node_modules/grunt-cli/bin/grunt <your task name>"
},
...
}
https://npmjs.org/doc/scripts.html
重要注意事项:
- 您可能需要更改
postinstall
脚本中grunt二进制文件的路径,如果grunt
命令没有执行,请检查错误输出 grunt
和grunt-cli
必须在package.json
中列为dependency
,以便Heroku安装。在devDependencies
下列出它们是不够的,因为Heroku不会安装它们。此外,请注意,Heroku不会将其作为全局包安装,因此要在Heroku上执行它,您必须使用相对路径(如上所述)
如果这不起作用(您可能需要稍微修改相对路径),那么您可能需要考虑为Heroku编写自己的自定义构建包。
更新
从0.4起,grunt
程序包不再包含grunt
二进制文件,后者现在是grunt-cli
程序包的一部分。答案已更新以反映这一点。
当Heroku Platorm APIslug
和release
功能进入主线时,这看起来将在很大程度上得到解决。此时,您可以在本地(或在ci服务器上)构建代码,将其打包并通过API调用发送到heroku,然后从那里发布。
这仍然处于测试阶段,直到2013年12月19日才公布。
https://devcenter.heroku.com/articles/platform-api-deploying-slugs
我从来没有对有多少人似乎可以将您生成的代码签入git或NPM postinstall挂钩感到非常高兴(
另外,从哲学的角度来看,在发布期间进行构建只是另一个潜在的失败点。
只是为了好玩:由于这还没有最终确定,这里有一个我整理的bash脚本,您可以暂时使用它在部署分支上构建代码,提交它,将它部署到heroku,然后删除部署分支。(我真的不喜欢bash部署脚本,所以我真的很期待API平台的添加)
#!/bin/bash
set -e
# Delete current deploy branch
git branch -D deploy
# Create new deploy branch based on master
git checkout -b deploy
# Grunt comands to build our site
grunt build:production
# the dist/ directory is in my .gitignore, so forcibly add it
git add -f dist/
git commit -m "Deploying to Heroku"
# Push it up to heroku, the -f ensures that heroku won't complain
git push heroku -f deploy:master
# Switch it back to master
git checkout master
Grunt(et al.)是一个构建工具,而不是(实际上)应该打包并在生产中运行的工具。另一种方法是使用Grunt在本地(或者更好地在CI服务器上)准备您的项目,然后只将构建的文件推送到Heroku。如前所述,Heroku将在推送后在您的应用程序上进行npm install
,这应该足以让您自己为应用程序做好准备。
我已经设置好了,Grunt派生/构建的Heroku应用程序与我的主要应用程序源代码回购完全独立。因此,当我执行grunt deploy
时,它会优化并将相关文件复制到Heroku repo,整理它(git add -A
等),然后是git push heroku master
(或其他)。
如果你的实时服务器只负责运行预构建的应用程序包,这似乎是一种更干净的担忧分离。
YMMV当然,上面公认的答案也是完全有效的。。。尤其是在像Heroku这样一个被充分理解和稳定的生活环境中。
Heroku构建包对我来说很好。很棒的东西。
为了使用grunt 4.0,我按照这里的说明进行了操作https://discussion.heroku.com/t/grunt-on-heroku/98/2。我唯一要做的改变是删除grunt的路径,因为使用unix风格的斜杠会使它在windows中失败,反之亦然。幸运的是,您甚至不需要指定路径,因为NPM将在node_modules/.bin文件夹中查找grunthttps://npmjs.org/doc/scripts.html#path.
-
确保您的package.json中本地安装了grunt和grunt-cli,即使grunt告诉您要全局安装cli:$:
npm i -S grunt grunt-cli
-
在您的package.json中添加一个安装后步骤,如下所示:
"postinstall": "grunt prod"
npm postinstall步骤可能是您的最佳选择,因为您可以从那里调用grunt。但您也应该查看一个自定义的构建包,比如heroku构建包nodejsgrunt。
这篇文章是Rails特有的,但我不明白为什么你不能将它与任何后端框架一起使用,而只能将Ruby构建包与你正在使用的任何东西交换。
解决方案基本上是使用多构建包,并让Node/Grunt构建包在Heroku上运行grunt build
。
值得注意的是,此解决方案不需要将构建工件检查到版本控制中(耶!!)
http://www.angularonrails.com/deploy-angular-rails-single-page-application-heroku/