2015-04-07 29 views
0

我正在構建cli節點模塊。我希望人們能夠npm install它,並立即使用它的命令,如npm my-project --arg=foo。這意味着本地項目CLI用作開發工具,而不是全局安裝。易於執行的本地安裝的cli NPM項目

好像這個標準是在package.json使用bin,但我不知道有關它的一些事情:

  1. 什麼時候應該使用bin當我應該使用scripts
  2. 如何在包含項目中運行命令? npm my-project不這樣做。

以下是我在package.json現在做:

{ 
    "name": "my-project", 
    "bin": "./cli.js" 
} 

而且我可以在本地運行:

node cli.js --arg=foo 

但是,當我npm-install my-project別的地方,我不知道如何運行它放入bin的腳本(npm run my-project不起作用),或者如果我正確使用它。

+0

經過了@robertklep的大量學習和幫助之後,我發現沒有辦法爲具有短可執行路徑的本地安裝創建模塊。您必須使用'./ node_modules/.bin/my-project'。根本的誤解。例如,這就是'grunt-cli'存在的原因。 – SimplGy

回答

2

讓我們先來解釋binscripts之間的區別入手:如果你想提供一個命令行工具,使用前,使用後如果要到npm提供額外的命令(有一些注意事項雖然,看下面)。我想你想用bin。但是,如果用戶使用npm my-project --arg=foo,則它們將使用my-project --arg=foo,前提是您的腳本被稱爲my-project。要做到這一點,你package.json將包含這樣的事情:

"bin" : "./bin/my-project" 

在安裝過程中,這將複製./bin/my-project到「bin」目錄(通常在類Unix OS'es /usr/local/bin)。在開發過程中,您可以將其稱爲node bin/my-project,或者只要它具有正確的權限,並且"shebang"即可。

編輯:讓我忘記了npm將在./bin使用包名稱,而不是文件的名稱,可執行文件的名稱(如果bin是一個字符串)。如果您的軟件包名爲my-project,並且您安裝軟件包(在npm將安裝可執行文件之前您需要使用-g標誌),它將創建一個名爲my-project的可執行文件,而不管bin屬性指向的位置。

換句話說:

package.json: 
    "name" : "my-project" 
    "bin" : "./cli.js" 

npm install -g: 
    copies ./cli.js to /usr/local/bin/my-project and sets executable permissions 

編輯完

FWIW,存儲CLI工具./bin是慣例,但並不是強制性的。

scripts指令對於更多內部用途很有用。例如,您可以使用它來運行測試套件,或者linters或者pre/post安裝腳本。

最後,有各種模塊可用於幫助命令行解析。我喜歡docopt,但其他常用模塊是commandernomnom。你已經提到過yargs

+0

我知道測試這個的唯一方法是在依賴項目中更改版本,git標籤,發佈,npm安裝。有沒有更簡單的方法來測試它符號鏈接的方式? 'npm link'是用於全局的東西,'npm unlink'對於本地軟件包來說並不是一個完美的東西(我認爲這是一種錯誤,但我沒有深入研究它) – SimplGy

+0

@SimplGy看到我對'bin'屬性的編輯。至於鏈接:'npm unlink'確實不會刪除符號鏈接,這很煩人。作爲使用'npm link'的替代方法,您可以在包目錄中爲腳本設置正確的權限,併爲其指定一個shebang(無論如何它都需要),因此您可以直接調用它:'$ ./cli.js ' – robertklep

+0

設置權限,有shebang。從項目內運行。認爲這是一個本地安裝問題,而不是全球問題。我完成了'version change publish npm install'循環,並且依賴項目現在將'node_modules/bin/my-project'添加爲符號鏈接,但它不在我能找到的任何$ PATH中。我已重新啓動終端,但我認爲也許本地安裝不放在$ PATH? – SimplGy