如何在Sails.js应用中避免Grunt在Heroku运行,本地预执行流水线
解决Sails.js部署Heroku时跳过Grunt任务、本地预编译后推送的问题
我之前也踩过Sails.js部署Heroku时Grunt任务报错的坑,折腾了一阵终于理顺了流程,给你一步步拆解怎么做:
1. 本地执行Grunt生产环境任务
先在本地把所有需要的预编译(比如uglify压缩、CSS合并)都做完,这样Heroku就不用重复跑这些任务了:
- 打开终端,切换到项目根目录,执行生产环境的Grunt命令:
这个命令会触发NODE_ENV=production grunttasks/register/prod.js里定义的所有生产任务,生成的压缩后资源、编译文件都会存到./tmp文件夹里,你可以进去检查下public/min这类目录是否有生成对应的文件。
2. 让Heroku启动时跳过Grunt任务
你已经注释了prod.js里的任务,但光这个还不够,得让Sails在生产环境启动时彻底不触发Grunt钩子:
- 打开
config/env/production.js,添加禁用Grunt的配置:
如果你不想完全禁用Grunt,只是跳过预编译任务,那可以把module.exports = { // 其他生产环境配置... hooks: { grunt: false // 完全关闭Grunt钩子,启动时不会执行任何Grunt任务 } };tasks/register/prod.js里的任务列表清空,比如:module.exports = function(grunt) { // 注释掉所有生产任务,让prod任务变成空操作 // grunt.registerTask('prod', [ // 'compileAssets', // 'concat', // 'uglify', // 'cssmin', // 'sails-linker:prodJs', // 'sails-linker:prodStyles', // // ...其他任务 // ]); };
3. 确保./tmp文件夹被推送到Heroku
默认情况下,Sails的.gitignore会忽略tmp/目录,所以得修改这个文件:
- 打开项目根目录的
.gitignore,找到tmp/这一行,把它注释掉(前面加#)或者直接删除。 - 然后把
tmp文件夹加入Git追踪:git add tmp/ git commit -m "Add precompiled assets from tmp folder"
4. 配置Heroku的启动命令
确保Heroku用正确的命令启动你的应用:
- 如果项目里没有
Procfile,新建一个,内容如下:
这个文件会告诉Heroku启动Web服务的命令,因为我们已经禁用了Grunt,直接启动web: NODE_ENV=production node app.jsapp.js就行。
5. 排查服务器启动失败的问题
如果还是启动不了,先看Heroku的日志找原因:
heroku logs --tail
常见的坑点:
- 文件权限问题:本地生成的
tmp文件权限可能在Heroku上不兼容,执行chmod -R 755 tmp/后再提交试试。 - 静态资源路径错误:检查
config/env/production.js里的paths配置,确保publicPath指向正确的位置,能读取到tmp里的预编译资源。 - 依赖问题:如果Grunt相关的包在
devDependencies里,Heroku默认不会安装,不过我们已经禁用了Grunt,这其实是好事,能减少部署体积;如果之前因为Grunt依赖报错,现在禁用钩子后就不会有这个问题了。
内容的提问来源于stack exchange,提问作者Suisse
相关产品推荐
相关产品推荐

