2013-02-02 273 views
64

我有一些「全局」依賴項(jshint,csslint,buster等),我想通過命令行自動安裝並執行,當我的包通過npm install安裝。這可能嗎?通過package.json安裝「全局」npm依賴關係

目前,我做如下手動:

  1. npm install -g <package_name>
  2. 從我的項目中:npm link <package_name>

更新: 跨越this feature request剛來到了故宮。看起來像package.json中的scripts配置是要走的路?

再次更新: 或者,在閱讀npm docs之後,也許我應該使用.gyp file?我很困惑。

回答

42

package.json無法指定依賴關係爲「全局」。而且,這是由Isaac設計的states in that feature request你引用:

是的,我們永遠不會這樣做。

但是,在本地安裝軟件包時仍然可以使用「二進制文件」。他們將在.../node_modules/.bin/。而且,您應該能夠將它們排列在preinstall script之間。

不過,如果該系列的命令是相當長的(如「jshint,csslint,終結者等。」所暗示的),你可能要考慮使用一個構建工具,如grunt執行各種任務:

{ 
    // ..., 

    "scripts": { 
     "preinstall": "grunt" 
    } 
} 
+0

謝謝@Jonathan。我想你是正確的。我目前有一個叫做'install'的咕task任務來處理構建modernizr,jquery等。並將隨機文件複製到我的lib文件夾中。這意味着開發人員需要自己安裝全局程序包,但是不管怎樣,這應該不是我應用程序的問題。 – uglymunky

+1

您的應用應該記錄其依賴關係,並且在我看來,確保它們以某種方式存在。 – EndangeredMassa

+3

https://www.npmjs.org/doc/misc/npm-scripts.html表示使用安裝腳本是一種反模式。 – Fdr

25

我真的很喜歡您安裝本地依賴性,然後使用bash腳本,設置路徑,以./node_modules/.bin格局。

文件:env.sh

# Add your local node_modules bin to the path for this command 
export PATH="./node_modules/.bin:$PATH" 

# execute the rest of the command 
exec "[email protected]" 

然後,您可以在任何bash命令之前使用這個腳本。如果一對同一個Makefile文件或NPM腳本:

Makefile的文件

lint : 
    ./env.sh csslint my_styles 

文件:的package.json

"scripts": { 
    "lint": "./env.sh csslint my_styles" 
} 

此任務在這些文件中的樣子,他們引用csslint在某些全局位置,但他們實際上在您的node_modules bin中使用了該版本。

真正令人敬畏的好處是,這些依賴關係可以很容易地進行版本控制,就像其他節點模塊一樣。如果你堅持使用全球安裝解決方案,那麼你可能會在用戶系統上破壞某個其他項目所需的特定版本。

+1

您是否可以詳細說明爲什麼每次要調用'./ node_modules/.bin /'命令時都使用腳本來設置路徑?在你的例子中,每次運行'lint'時,即使它已經存在,你也會在路徑中加上'./ node_modules/.bin'。爲什麼不直接在個人資料中設置路徑?如果該命令不存在,shell將繼續查看'$ PATH'的其餘部分。 – N13

+1

我希望這可以被任何人使用。我可以將其設置在我的個人資料中,這對我很有用,但那些想要在這個模塊上工作的人都必須這樣做。請注意,package.json腳本中不再需要'./env.sh'。 – EndangeredMassa

+2

我還是不明白你爲什麼要設置'PATH'。如果所有'./ node_modules/.bin /'命令都通過'env.sh'路由,那爲什麼還要用PATH呢? 'exec ./node_modules/.bin/$ @'不夠嗎? – N13

7

你應該試試這個:https://github.com/lastboy/package-script

我一直在使用它來直接從安裝的package.json全球NPM包。對於沒有技術知識的客戶來說,它效果很好。

它甚至會檢查軟件包是否已安裝,如果沒有安裝它們!

相關問題