我有一个项目在目录server/shared
中有一个Git子模块。子模块是一个AngularJS前端(在多个项目之间共享,因此是submodlue)需要用Grunt准备(内部也使用Compass)。
现在,我grunt
计算机上的项目并将其部署到GitHub和Heroku。我想要的是停止部署Grunted文件,而是部署源代码并让Heroku拉出子模块(它会这样做)并在npm install
中调用grunt deploy --target production
和server/shared
(就像我想的那样)我的本地计算机),我无法正常工作。
我试过
grunt-submodule
,因为项目未被Heroku识别为Git项目而无效(我无法将其重建为一个项目);
来自npm
或grunt
的“开始package.json
和/或Gruntfile.js
”的许多变体(在项目根目录和/或{{1}中}}),后者是在this example;
除了Heroku的server/shared
之外,各种NodeJS + Grunt + Compass构建包。
主要项目是Flask(Python),并不真正需要Node / Grunt / Compass / ...,并且尽可能保持干净,以便更容易准备其他东西同一部署的项目。)
答案 0 :(得分:0)
所以,我得到了它的工作,但我仍然愿意接受更好的解决方案。
我将调用项目“Main”和“Frontend”(Main的Git子模块)。大多数设置都在Main中,我仍然希望避免使用,以使将来类似的安装变得更简单,但我现在还不知道如何实现。
我向Main添加了3个buildpack:heroku/ruby
(对于Compass支持;否则不需要),heroku/nodejs
(对于Grunt支持)和heroku/python
(因为Main是Flask项目) :
heroku buildpacks:clear &&
heroku buildpacks:add heroku/ruby &&
heroku buildpacks:add heroku/nodejs &&
heroku buildpacks:add heroku/python
然后,我将Gemfile
添加到Main:
source "https://rubygems.org"
gem 'sass', "3.4.23"
gem 'compass', "1.0.3"
gem 'bootstrap-sass', "3.3.7"
如果您不使用bootstrap-sass
,则不需要最后一行。
您还需要Gemfile.lock
,您可以使用bundle check
,bundle install
和bundle update
检查/创建/刷新。
我们真的不需要在Main上进行Grunt处理,但我们仍然需要Main中的Gruntfile.js
来调用子模块的处理(在this example之后创建):
module.exports = function(grunt) {
grunt.registerTask('buildapp', function(dir) {
var done = this.async();
var done_or_error = function(err, result, code) {
if (err == null) {
grunt.log.writeln(result);
grunt.log.writeln('processed ' + dir);
done();
}
else {
grunt.log.writeln('processing ' + dir + ' failed: ' + code);
grunt.log.writeln(' ERR: ' + err);
grunt.log.writeln(' RESULT: ' + result);
done(false);
}
};
grunt.log.writeln('processing ' + dir);
grunt.util.spawn(
{
cmd: 'npm',
args: ['install'],
opts: {
cwd: dir,
},
},
done_or_error
);
});
grunt.registerTask('build', function() {
grunt.task.run(['buildapp:server/shared']);
});
grunt.registerTask('heroku', ['build']);
};
如果你的Main已经在使用Grunt,你可以将上面的内容添加到其中。
要自动运行此功能,请在Main中创建package.json
:
{
"name": "...",
"version": "...",
"dependencies": {
"compass": "^0.1.1",
"grunt": "^0.4.5",
"grunt-cli": "^1.2.0",
"grunt-util-spawn": "0.0.2"
},
"engines": {
"node": "8.4.0"
},
"scripts": {
"postinstall": "grunt heroku"
}
}
这里的关键部分是grunt heroku
。剩下的只是我的依赖,对你来说可能有所不同。
以上内容会在前端触发npm install
。要让那个也运行Frontend的Grunt,添加
"postinstall": "grunt ..."
到前端"scripts"
的{{1}}。这就是你通常手动构建你的前端的方法(在我的例子中,完整的命令是package.json
)。
不要忘记将生成的文件添加到grunt deploy --target production
。对于我的Main,它只是.gitignore
,而对于我的前端,它是:
/node_modules
理想情况下,您将项目设置为只有一个目录包含Grun生成的文件(由于遗留原因,我有几个目录)。