2017-05-11 33 views
0

對於我的項目,我在github上創建了一個包含一些與項目相關的工具的git。 git包含一個package.json和一些映射到bin指令的二進制文件。 雖然是一個私人回購並沒有公佈任何實際NPM回購服務器,它可以使用如何在全局安裝時從腳本獲取我的npm repo的路徑

$ npm install -g git+ssh://[email protected]:<path to my tool git> 

大部分工具沒有任何依賴關係模塊中的其他文件進行安裝,他們的工作只是罰款。不過的工具之一是啓動local DynamoDB server的包裝,和我的package.json包含這樣一段:

"bin": { 
    "ddb-local": "db/ddb_local.sh" 
} 

db/db_local.sh文件包含java命令來啓動DynamoDB:

#/bin/bash 
java -Djava.library.path=DynamoDB/DynamoDBLocal_lib -jar DynamoDB/DynamoDBLocal.jar -inMemory 

DynamoDB文件夾是在我的模塊的根目錄下的db文件夾中:

<module root> 
| 
|- db 
    |- DynamoDB 
     |- DynamoDBLocal.jar 
     |- DynamoDBLocal_lib 
    | ddb_local.sh 
|- package.json 

安裝後, ddb-local從我的節點bin文件夾鏈接,可以從任何地方調用,但ddb_local.sh腳本將失敗(除非<path to my module>/db文件夾碰巧是我的當前目錄),因爲它會嘗試查找與該腳本相關的文件,在使用NVM我的情況下,從像~/.nvm/versions/node/v4.6.1/bin/

運行現在,如果這是一個節點劇本,我將能夠require文件在我自己的模塊很容易,但因爲它是一個bash腳本,我不知道是什麼最好的方法是在我的模塊目錄中生成有效的文件路徑。

我知道我的包~/.nvm/versions/node/v4.6.1/lib/node_modules/<my module>下安裝,雖然我可以像

`dirname "$0"`/../lib/node_modules/<module name> 

創建到使用的東西我模塊的文件相對路徑,這並不真的似乎是有道理的。當然,有一種簡單的方法可以從全局安裝爲二進制文件的腳本引用模塊中的其他腳本或文件?我打印了所有的環境變量等,尋找包含模塊路徑的東西,但沒有運氣。

+0

在你的情況下,轉到你的模塊的根文件夾'my_module',執行'npm link',然後返回到你想引用/導入並執行'npm link my_module'的位置。希望這可以幫助! –

+0

雖然npm鏈接可能有所幫助,但這個模塊的目的是我組織中的其他用戶應該能夠'npm install -g',然後能夠使用這些工具而不必訴諸任何額外的魔法。 我現在的代碼有效,但它對我的模塊名稱有依賴性,同時也很難看。我嘗試使用$ 0並解析npm從$ NODE/bin創建的符號鏈接。/ lib/node_modules/,因爲那至少會給我腳本的真正路徑,但是沒有運氣。 – JHH

回答

0

我想出了使用的dirnamereadlink組合稍微更好的解決方案:

SCRIPT_PATH=$(dirname $(dirname $0)/$(readlink $0)) 

它使用的是全球的裝機NPM模塊被安裝爲一個符號,從$NODE_PATH/bin/<script>../lib/node_modules/<npm-module>/<script>的事實。

它在所有環境中可能都不是100%健壯的,它仍然覺得應該有一個更簡單的方法,但它的工作原理。