2015-10-20 40 views
0

我有一個奇怪的一套使用打字稿和互相依賴類似「本地」 NPM模塊運行NPM prepublish:對整個項目

A -> B, C 
B -> C 
C -> D 

我需要運行npm install,讓我所有的打字稿的編輯,以便或它將無法正確地找到東西。我覺得我應該使用prepublish腳本來處理TypeScript編譯,但似乎沒有級聯prepublish請求本地依賴關係。

我該如何設置一堆帶有prepublish腳本的本地模塊,以便在運行npm install時可以得到合適的解決?


另一種方法來說出我所問的問題:如何維護多個本地節點模塊並同時修改它們?這些模塊對彼此具有不同的依賴性,並且對其單獨進行修改是非常不方便的。

回答

0

我想出瞭如何去做我所需要的。在更新到npm 3.3.9和TypeScript 1.6後,我可以使用postinstall腳本來實時編譯。原型住在這裏:https://github.com/MrHen/TypeScriptNpm

但最重要的作品是:

// In the module's package.json 
"scripts": { 
    "build": "gulp npmbuild", 
    "postinstall": "npm run build" 
}, 

和:

// In the server's package.json 
"dependencies": { 
    "hen-doodad": "file:../modules/hen-doodad", 
    "hen-widget": "file:../modules/hen-widget" 
} 

和:

// In the gulpfile 
gulp.task('npmbuild', function() { 
    gulp_util.log('Detecting appropriate starting directory...', process.env.INIT_CWD); 

    var out = process.env.INIT_CWD + '/app'; 
    var build = [process.env.INIT_CWD + '/**/*.ts', 'typings/tsd.d.ts', '!' + process.env.INIT_CWD + '/node_modules/**/*']; 
    var typings = 'typings/tsd.d.ts'; 

// ... do typescript build using above paths 

感覺就像一個黑客位,但是這比prepublish工作更一貫。要運行整個事情,請在服務器文件夾內部執行npm install

吞嚥任務是可選的。推測你可以直接使用tsc


應當指出的是,這肯定是不如何你應該打包起來NPM模塊。我必須這樣做的原因涉及預先存在的構建系統的細節。從做這樣

陷阱:

  • 不適合由NPM使用的標準的出版模式。
  • 構建的文件僅存在於服務器的nod​​e_modules中,根據您對它們所做的操作,這些文件可能會很笨拙。
  • 運行npm安裝兩次將不是搶最新的變化。您需要刪除已安裝的模塊或更新模塊上的版本號。
  • 每個模塊都有自己的TypeScript構建版本,而不是整體構建。如果您可以一次構建所有內容,則應該這樣做。
  • 由於它們如何自動檢測包含在node_modules內的打字文件,因此需要TypeScript 1.6或更高版本。
0

TypeScript編譯,但它似乎並沒有級聯本地依賴項的預發佈請求。

事實上,預發佈只運行安裝的依賴關係。在將它們放在NPM上並安裝它們之前,您的依賴關係應該已經建立(帶有預發佈)。

+0

我們不會發布到NPM。所有這些都在我們的代碼庫中,並且在本地構建/安裝。 – MrHen

+0

編寫一個bash腳本: - /。這不是'npm prepublish'或任何'npm腳本'被設計爲運行的方式。在你的代碼被觸及之前,NPM假定'npm install'應該對'node_modules'內的任何事情做任何事情。 – basarat

+0

一個簡單的編譯腳本是不夠的。我需要他們編譯「按順序」,所以TypeScript需要/類型落實到位。 – MrHen

0

假設你正在使用的打字稿1.6+支持節點模塊的分辨率。當你試圖保持所有模塊同步時,我想你的項目剛剛開始。

我想符號鏈接會做的工作,但如果你有更多的問題,請讓我知道。

更具體地,可以手動創建符號鏈接或採取的npm link優點。

cd /path-of-a-module 
npm link # this will create a link as global module 
cd /path-of-your-app 
npm link your-module-name 

然後,你可能只是愉快地維護這些模塊。

至於在package.json文件相關的配置,它可能是一個Git倉庫。但是,你可能會留下編譯好的* .js和* .d.ts文件,一切都會正常工作。

+0

在各種開發環境中維護這似乎不切實際。有沒有更好的方式來創建鏈接?有點像'npm link pathA pathB'? – MrHen

+0

我想你可能想寫一個腳本,這可能相當簡單。無論如何,您不必使用'npm'來創建符號鏈接。 – vilicvane