2013-01-06 48 views
97

假設我已經爲Node.js編寫了一個模塊,我希望它保持私有模式。我知道我可以(應該)添加一行:在特定版本中從Git安裝npm

"private": "true" 

package.json文件,我也知道我可以使用文件系統路徑或一個Git倉庫,包括GitHub的鏈接npm install這個模塊。

我也知道,我可以把這樣的文件系統路徑或鏈接到一個混帳回購協議爲package.json,使dependencies部分可能看起來有點像這樣:

"dependencies": { 
    "myprivatemodule": "[email protected]:..." 
} 

我現在想的是不鏈接到最新版本,但具體到一個。我知道的唯一可能性是使用其ID來鏈接到特定的提交。但與使用版本號(例如0.3.1)相比,這種方式的可讀性和可維護性都較差。

所以我的問題是:是否可以指定這樣的版本號,並使npm搜索包含此版本的最新提交的git存儲庫?

如果不是,您如何解決您的項目中的這個問題?你有提交ID或有更好的解決方案嗎?

回答

116

A dependency必須從registry開始才能安裝,只需安裝specifying a version descriptor即可。

如果您的項目不應該公開共享,那麼您當然可以create and use your own registry而不是registry.npmjs.org

但是,如果它不在註冊表中,它將不得不由URLGit URL引用。要使用Git URL指定版本,請在末尾包含適當的<commit-ish>(如標籤)作爲URL fragment

實施例,對於名爲0.3.1標籤:

"dependencies": { 
    "myprivatemodule": "[email protected]:...#0.3.1" 
} 

:上述片段顯示了基本URL相同的,因爲它被張貼在的問題。

的剪斷部分(...)應填寫:

"myprivatemodule": "[email protected]:{owner}/{project}.git#0.3.1" 

並且,將需要不同的地址格式時SSH訪問不可用:

"myprivatemodule": "git://github.com/{owner}/{project}.git#0.3.1" 

根據您的操作系統,您可能還能夠link到您從G克隆的其他文件夾中的依賴關係ithub。

+0

顯得有些在這篇文章中的鏈接已經過時,因爲它們會導致404頁,而不是。這很遺憾,因爲其中一些是我一直在尋找的信息。 – MvG

+0

@MvG啊,謝謝。鏈接已更新。 –

+2

我用git tag -a「1.0.0」標記了一個特定的版本,並推送了'git push --tags',然後我在'git + ssh'依賴項末尾添加了'#v1.0.0'。但在'npm update'上沒有任何反應。 – loretoparisi

1

如果您使用多個模塊執行此操作,並希望對版本有更多的控制權,您應該考慮擁有自己的私人npm註冊表。

這樣你可以npm發佈你的模塊到你的私有npm註冊表並使用包。json的輸入方式與公共模塊的輸入方式相同。

https://docs.npmjs.com/files/package.json#dependencies

+0

所有鏈接都是404 –

144

接受的答案並沒有爲我工作。下面是我在做什麼,以從GitHub拉包:

"dependencies": { 
    "package": "git://github.com/username/package.git#commit" 
} 
+0

約定;編輯接受的答案以引用正確的語法 – toblerpwn

+16

如果您使用http/https,請確保您包含「git +」前綴:''package「:」git + https://github.com/username/package.git#commit 「' –

+1

這工作至於」npm install「,但當我試圖運行我的應用程序時,require('mymodule')未能找到它的包。即使該軟件包位於具有相同名稱的node_modules目錄中。 – Derrick

45

如果版本你的意思是標籤或釋放,然後github上提供的下載鏈接。例如,如果我想安裝fetch版本0.3.2(這是不適用於NPM),然後我添加到我的package.jsondependencies下:

"fetch": "https://github.com/github/fetch/archive/v0.3.2.tar.gz", 

唯一的缺點相比與提交哈希方法是一個散列可以保證不代表已更改的代碼,而標籤可以被替換。謝天謝地,這很少發生。

更新:

這些天,我使用的方法是對GitHub上的緊湊符號擔任依賴性:

"dependencies": { 
    "package": "github:username/package#commit" 
} 

在哪裏犯可以是任何東西commitish,類似這樣的標記。在GitHub的情況下,您甚至可以刪除最初的github:,因爲這是默認設置。

+11

向下投票是好的,但請考慮留下評論,以便我可以改進此答案。 – qubyte

+2

不知道爲什麼它是downvoted,你的更新的建議是我所需要的 - 謝謝 –

+0

我不認爲這是與npm v5.5.1 – Murilo

1

我的例子註釋@qubyte above得到切碎的,所以這裏的東西,更易於閱讀...

@surjikal描述above作品分支提交的方法,但它並沒有爲工作承諾我正在嘗試包括。


存檔模式也適用於提交。例如,fetch @ a2fbf83

NPM

npm install https://github.com/github/fetch/archive/a2fbf834773b8dc20eef83bb53d081863d3fc87f.tar.gz 

yarn add https://github.com/github/fetch/archive/a2fbf834773b8dc20eef83bb53d081863d3fc87f.tar.gz 

格式

https://github.com/<owner>/<repo>/archive/<commit-id>.tar.gz 


這裏的 提交所需的 /archive/模式:

yarn add https://github.com/vuejs/vuex/archive/c3626f779b8ea902789dd1c4417cb7d7ef09b557.tar.gz 

的相關vuex commit