2014-01-26 150 views
5

我有一個帶有handlebars.js作爲子模塊的git項目。我將在這裏提供一個簡單的例子 - 整個項目更復雜,dojo任務和部署步驟在這裏不相關。npm安裝git子模塊的依賴關係

$ mkdir handlebarstest ; cd handlebarstest ; git init 
$ mkdir src ; git add src 
$ git submodule add https://github.com/wycats/handlebars.js.git src/handlebars.js 

我們package.json沒有提到handlebars.js,只是咕嚕:

{ 
    "name": "handlebarstest", 
    "version": "1.0.0", 
    "dependencies": {}, 
    "devDependencies": { 
    "grunt": "~0.4.1", 
    "grunt-contrib-clean": "~0.4.1", 
    "grunt-run-grunt": "latest" 
    } 
} 

在這個項目的歷史,我們的安裝和建造過程一直以:

$ npm install # install dependencies in package.json 
$ grunt init # run the 'init' task which initialises git submodules 
$ grunt build # run the 'build' task which compiles dojo etc. 

已經做了我們的項目的新克隆,在我們的構建服務器上說,git子模塊需要初始化,並且我們從grunt控制它,所以我們必須先安裝grunt,然後運行一個任務到init子模塊,inc lu the麻煩的handlebars.js。

我們做npm install並安裝grunt和grunt init,它取得了handlebars.js,包括它的package.json。所以我們問題的根本在於package.json在頂層npm install運行時不可用。

我們Gruntfile.js知道如何調用Gruntfile.js在handlebars.js:因爲它遞歸進入handlebars.js但在它的package.json模塊依賴關係都沒有

/*jshint node:true */ 
module.exports = function (grunt) { 
    /*jshint camelcase: false */ 
    var path = require('path'); 

    grunt.initConfig({ 
     clean: [ 'dist' ], 
     run_grunt: { 
      options: { 

      }, 
      handlebars_build: { 
       options: { 
        log: true 
       }, 
       src: [ 'src/handlebars.js/Gruntfile.js' ], 
       task: 'build' 
      }, 
      handlebars_amd: { 
       options: { 
        log: true 
       }, 
       src: [ 'src/handlebars.js/Gruntfile.js' ], 
       task: 'amd' 
      } 
     } 
    }); 

    // var handlebarsLink= grunt.registerTask('handlebarsLink', function() { 
    // var done = this.async(), 
    //  child = grunt.util.spawn({ 
    //   cmd: 'npm', 
    //   args: [ 'link', 'src/handlebars.js' ] 
    //  }, function (error) { 
    //   if (error) { 
    //    grunt.warn(error); 
    //    done(false); 
    //    return; 
    //   } 
    //   done(); 
    //  }); 

    // child.stdout.on('data', function (data) { 
    //  grunt.log.write(data); 
    // }); 
    // child.stderr.on('data', function (data) { 
    //  grunt.log.error(data); 
    // }); 
    // }); 
    var submodules; 
    if (grunt.file.exists(__dirname, '.git')) { 
     submodules = grunt.registerTask('submodules', function() { 
      var done = this.async(), 
       child = grunt.util.spawn({ 
        cmd: 'git', 
        args: [ 'submodule', 'update', '--init', '--recursive' ] 
       }, function (error) { 
        if (error) { 
         grunt.warn(error); 
         done(false); 
         return; 
        } 
        done(); 
       }); 

      child.stdout.on('data', function (data) { 
       grunt.log.write(data); 
      }); 
      child.stderr.on('data', function (data) { 
       grunt.log.error(data); 
      }); 
     }); 
    } 
    var init = submodules ? [ 'submodules'/*, 'handlebarsLink'*/ ] : []; 
    grunt.registerTask('init', init); 
    grunt.registerTask('default', 'build'); 
    grunt.registerTask('build', init.concat([ 'clean', 'run_grunt:handlebars_build', 'run_grunt:handlebars_amd' ])); 

    grunt.loadTasks(path.join(__dirname, 'grunt')); 
    grunt.loadTasks(path.join(__dirname, 'src', 'intern', 'tasks')); 
    grunt.loadNpmTasks('grunt-contrib-clean'); 
    grunt.loadNpmTasks('grunt-run-grunt'); 
}; 

運行咕嚕失敗安裝。

Running "run_grunt:handlebars_build" (run_grunt) task 
--> starting "src/handlebars.js/Gruntfile.js" 
--> reporting "src/handlebars.js/Gruntfile.js" 
    | >> Local Npm module "grunt-contrib-clean" not found. Is it installed? 
    | >> Local Npm module "grunt-contrib-concat" not found. Is it installed? 
    | >> Local Npm module "grunt-contrib-connect" not found. Is it installed? 
    | >> Local Npm module "grunt-contrib-copy" not found. Is it installed? 
    | >> Local Npm module "grunt-contrib-requirejs" not found. Is it installed? 
    | >> Local Npm module "grunt-contrib-jshint" not found. Is it installed? 
    | >> Local Npm module "grunt-contrib-uglify" not found. Is it installed? 
    | >> Local Npm module "grunt-contrib-watch" not found. Is it installed? 
    | >> Local Npm module "grunt-saucelabs" not found. Is it installed? 
    | >> Local Npm module "es6-module-packager" not found. Is it installed? 
    | Loading "metrics.js" tasks...ERROR 
    | >> Error: Cannot find module 'underscore' 
    | Loading "publish.js" tasks...ERROR 
    | >> Error: Cannot find module 'underscore' 
    | Loading "version.js" tasks...ERROR 
    | >> Error: Cannot find module 'async' 
    | Warning: Task "clean" not found. Use --force to continue. 
    | 
    | Aborted due to warnings. 
    | 
--> failed "src/handlebars.js/Gruntfile.js" (304ms) 
--> failed handlebars_build @ "src/handlebars.js/Gruntfile.js" 

Warning: 1 gruntfile failed and completed 0 (308ms) 
Use --force to continue. 

解決方案可能是:

  1. 使用npm link不知何故在我們的頂級package.jsonnpm install已經 結束後做 一些聰明與腳本掛鉤。這似乎是不可能的,因爲在npm install完成後, handlebars.js/package.json將不可用,直到井 。
  2. run_grunt:handlebars_build之前放入一個手動步驟,以便遞歸到src/handlebars.js中並在該目錄中運行 npm install。這似乎比我想象的要更手動。
  3. 將一個步驟之前run_grunt:handlebars_build這 從src/handlebars.js/package.json安裝依賴到 項目的頂級node_modules目錄,那麼這可能是 拿起裏面src/handlebars.js運行Gruntfile.js時(這 可能需要沒有node_modules目錄 src/handlebars.js - 我對npm和node_modules的瞭解不是 很棒)。
  4. 放棄嘗試構建handlebars.js作爲我們的 項目構建的一部分,從 項目中刪除src/handlebars.js子模塊,並在其位置添加作爲純文件的構建文件。這個 將是一個遺憾,因爲你失去了通過git submodule方法智能跟蹤 項目版本的好處。

有關建議,最好的方法將不勝感激。

+2

我想我失去了你爲什麼擺在首位 「建設」 把手?你說「智能地跟蹤項目的版本」,但我不確定你的意思。你如何跟蹤版本?爲什麼?與此不同的是,您是僅在客戶端使用Handlebars還是在預編譯步驟?如果僅在客戶端上,或許將此依賴關係切換爲[Bower](http://bower.io)會更好? – jakerella

+0

@jakerella'跟蹤版本'我的意思是我們可以一次提供特定版本的項目,沒有其他原因。基本上,package.json的'dependency'行會給我們什麼,但在這種情況下管理通過git子模塊修訂版。這是一個預編譯步驟..我們的''grunt build''需要運行Dojo構建過程,該過程收集構建目錄中的文件(包括句柄及其AMD片段),並將它們準備爲'dist'web應用程序。也許鮑爾是我們前進的正確方向,我會嘗試。謝謝你的提示。 – Neek

+1

嗯......好吧,如果它是構建依賴項所必需的,那麼我想我不會遵循爲什麼你不能使用npm和'package.json'文件來包含它。對不起,我確定我錯過了一些東西,只是不知道是什麼。 – jakerella

回答

4

,這可能是一些幫助的人絆倒了這個問題就像我在我的研究有關類似的問題時那樣:

我的解決方案使用grunt插件grunt-run運行在子模塊目錄npm install(安裝依賴成它自己的node_modules目錄:那你的情況就是src/handlebars.js/node_modules/)。

在我的情況下,我需要在子模塊內使用grunt任務編譯TypeScript文件。我使用插件grunt-submodule解決了這個問題。

>> Local Npm module "grunt-contrib-clean" not found. Is it installed?` 

錯誤似乎如果grunt在錯誤的工作目錄執行出現 - 如果你已經成功之前安裝的依賴關係。

實施例:

只有子模塊使用grunt-contrib-clean清潔其生成僞像。您已經安裝了子模塊需求(在其目錄中),但您在父目錄中運行了grunt clean。節點模塊在這個地方是未知的。

希望幫助,

馬庫斯


這些任務當然是跑從grunt中,融入了我的構建/開發生命週期。

參考文獻: