2017-09-04 137 views
0

我有一個項目在目錄server/shared中有一個Git子模塊。子模塊是需要使用Grunt(內部也使用Compass)準備的AngularJS前端(在多個項目之間共享,因此是子模型)。將Herun子模塊部署到Heroku

現在,我grunt項目在我的電腦上,並部署到GitHub和Heroku。我想要的是停止部署Grunted文件,然後部署源代碼並讓Heroku拉動子模塊(它的作用),然後在server/shared(如我在本地計算機上)調用npm installgrunt deploy --target production(我無法正常工作) 。

我試圖

  • grunt-submodule,這不起作用,因爲該項目沒有被識別爲在Heroku上一個Git項目(我不能重建它被看作是一個);

  • 許多從任package.jsonGruntfile.js「啓動npm和/或grunt」(在任一項目的根和/或server/shared)的變體,與this example後後者被提出;

  • 除Heroku的heroku/nodejs之外,各種NodeJS + Grunt + Compass構建包。

主要項目是瓶(蟒蛇)和並不真正需要的節點/格朗特/北斗/ ...,這將是很好的保持它的東西儘可能的乾淨(使它更容易爲同一部署準備其他項目)。

回答

0

所以,我得到了它的工作,但我仍然開放更好的解決方案。

我將調用項目「Main」和「Frontend」(Main的Git子模塊)。大多數設置都是在Main中,我仍想避免這種設置,以便將來進行類似的安裝,但我現在不知道如何實現。

我加入3- buildpacks主:heroku/ruby(對於羅盤的支持;否則不需要),heroku/nodejs(對於咕嚕支持),並且heroku/python(因爲主要是燒瓶項目):

heroku buildpacks:clear && 
heroku buildpacks:add heroku/ruby && 
heroku buildpacks:add heroku/nodejs && 
heroku buildpacks:add heroku/python 

然後,我加入Gemfile主:如果你不使用bootstrap-sass不需要

source "https://rubygems.org" 

gem 'sass', "3.4.23" 
gem 'compass', "1.0.3" 
gem 'bootstrap-sass', "3.3.7" 

最後一行。

您還需要Gemfile.lock,你可以查看/創建/與bundle checkbundle installbundle update刷新。

我們並不真正需要的主要咕嚕處理,但我們仍然需要在主一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']); 
}; 

如果你的主要是已經使用Grunt,您可以將上述內容添加爲其中的任務之一。

要自動獲得此運行,在主要創建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。爲了有一個運行前端的咕嚕聲,以及在前端的package.json添加

"postinstall": "grunt ..." 

"scripts"。這是你通常手動建立你的前端(在我的情況下,完整的命令是grunt deploy --target production)。

不要忘記將生成的文件添加到.gitignore。對於我的主,它只是/node_modules,而我的前端,它是:

/node_modules 
gen 
/dist 
/static/css 

理想情況下,你必須設定的項目只有一個目錄中GRUN生成的文件,(我有幾個,由於傳統原因)。