将grrouted子模块部署到Heroku

时间:2017-09-04 14:56:25

标签: git heroku gruntjs compass

我有一个项目在目录server/shared中有一个Git子模块。子模块是一个AngularJS前端(在多个项目之间共享,因此是submodlue)需要用Grunt准备(内部也使用Compass)。

现在,我grunt计算机上的项目并将其部署到GitHub和Heroku。我想要的是停止部署Grunted文件,而是部署源代码并让Heroku拉出子模块(它会这样做)并在npm install中调用grunt deploy --target productionserver/shared(就像我想的那样)我的本地计算机),我无法正常工作。

我试过

  • grunt-submodule,因为项目未被Heroku识别为Git项目而无效(我无法将其重建为一个项目);

  • 来自npmgrunt的“开始package.json和/或Gruntfile.js”的许多变体(在项目根目录和/或{{1}中}}),后者是在this example;

  • 之后制作的
  • 除了Heroku的server/shared之外,各种NodeJS + Grunt + Compass构建包。

主要项目是Flask(Python),并不真正需要Node / Grunt / Compass / ...,并且尽可能保持干净,以便更容易准备其他东西同一部署的项目。)

1 个答案:

答案 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 checkbundle installbundle 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生成的文件(由于遗留原因,我有几个目录)。