我有一個帶有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.
解決方案可能是:
- 使用
npm link
不知何故在我們的頂級package.json
到npm install
已經 結束後做 一些聰明與腳本掛鉤。這似乎是不可能的,因爲在npm install
完成後,handlebars.js/package.json
將不可用,直到井 。 - 在
run_grunt:handlebars_build
之前放入一個手動步驟,以便遞歸到src/handlebars.js
中並在該目錄中運行npm install
。這似乎比我想象的要更手動。 - 將一個步驟之前
run_grunt:handlebars_build
這 從src/handlebars.js/package.json
安裝依賴到 項目的頂級node_modules目錄,那麼這可能是 拿起裏面src/handlebars.js
運行Gruntfile.js時(這 可能需要沒有node_modules目錄src/handlebars.js
- 我對npm和node_modules的瞭解不是 很棒)。 - 放棄嘗試構建handlebars.js作爲我們的 項目構建的一部分,從 項目中刪除
src/handlebars.js
子模塊,並在其位置添加作爲純文件的構建文件。這個 將是一個遺憾,因爲你失去了通過git submodule方法智能跟蹤 項目版本的好處。
有關建議,最好的方法將不勝感激。
我想我失去了你爲什麼擺在首位 「建設」 把手?你說「智能地跟蹤項目的版本」,但我不確定你的意思。你如何跟蹤版本?爲什麼?與此不同的是,您是僅在客戶端使用Handlebars還是在預編譯步驟?如果僅在客戶端上,或許將此依賴關係切換爲[Bower](http://bower.io)會更好? – jakerella
@jakerella'跟蹤版本'我的意思是我們可以一次提供特定版本的項目,沒有其他原因。基本上,package.json的'dependency'行會給我們什麼,但在這種情況下管理通過git子模塊修訂版。這是一個預編譯步驟..我們的''grunt build''需要運行Dojo構建過程,該過程收集構建目錄中的文件(包括句柄及其AMD片段),並將它們準備爲'dist'web應用程序。也許鮑爾是我們前進的正確方向,我會嘗試。謝謝你的提示。 – Neek
嗯......好吧,如果它是構建依賴項所必需的,那麼我想我不會遵循爲什麼你不能使用npm和'package.json'文件來包含它。對不起,我確定我錯過了一些東西,只是不知道是什麼。 – jakerella