![](/img/trans.png)
[英]Azure: Deploy from source control using Visual Studio Team Services
[英]Multiperson team using NuGet and source control
我在一個使用Team Foundation Server進行源代碼控制的兩人團隊中。 我開始了一個新的解決方案。 對於該解決方案,我創建了幾個項目。 在其中許多中,我使用 NuGet 來安裝 AutoMapper 和 Unity。 然后我右鍵單擊解決方案並選擇“添加到源代碼管理”。 然后我簽入了由此產生的未決更改。
我團隊中的另一個人做了最新的,所有 NuGet 參考對他來說都失敗了。
所以,我想我需要添加packages 文件夾。 所以我就這么做了。
在我這樣做之后,NuGet 引用仍然失敗(對他來說)。
此外,當我嘗試將 NuGet Package 添加到文件時,我現在收到此錯誤:
拒絕訪問路徑“C:\src\MyPath\ToMySolution\packages\repositories.config”。
我認為這是因為repositories.config文件現在處於源代碼控制之下(因此在手動簽出之前它是只讀的)。
所以,這是我的兩個問題:
我做錯了嗎? 或者 NuGet 真的不適合與源代碼管理一起使用?
編輯 2014/03/31:不再需要手動基於 MSBuild 的 package 恢復啟用,另請參閱http://xavierdecoster.com/migrate-away-from-msbuild-based-nuget-package-restore 。
編輯 2012/02/07:這現在是 NuGet vsix 的內置功能,稱為啟用 Package 恢復。
過時的替代品
為此有一個 NuGet package,它被稱為 NuGetPowerTools。 它向 Visual Studio 中的 NuGet Package 管理器控制台添加了兩個新命令,其中 Enable-PackageRestore 是您感興趣的一個。
It will add a.nuget folder which contains nuget.exe, nuget.settings.targets and nuget.targets. 當您運行 enable package restore 時,它將枚舉您的解決方案中的所有項目,並在項目文件中添加一個import nuget.targets語句(實際上是 ZFEB51D3D10608EE1834E88A88DABF8EZ 文件本身)。
每當您構建項目或整個解決方案時,nuget 將獲取該項目/解決方案的所有包,如 packages.config 文件中所定義。 這發生在預構建步驟中。
所以,簡而言之:
每當有人獲得源代碼時,無論是團隊中的其他開發人員還是構建代理,msbuild 進程都會被指示在預構建步驟中獲取任何所需的包。
此外,當包未提交到 TFS 源代碼管理中時,您不會遇到只讀標志問題,或與二進制文件合並沖突。
如果您願意,您還可以在我的博客上查看這種方法的基本推理。
不要檢查包文件夾。
將以下預構建事件添加到您的項目中:
$(SolutionDir)build\nuget install $(ProjectDir)packages.config -source \\server\path\NuGetPackages -o $(SolutionDir)packages
如果不使用自定義包,則省略-source parameter
。
nuget.exe 被簽入$(SolutionDir)build\nuget
。
我也有這個問題。 我喜歡 NuGet 恢復的想法,但我覺得我不需要它。 我希望我的 JR 開發人員能夠檢查解決方案並擁有他們需要的一切。
所以我將我的包文件夾置於源代碼管理之下。
在這種情況下,我啟用 NuGet 的解決方案是從上面注意到這一點:
“我認為這是因為repositories.config文件現在處於源代碼控制之下(因此在手動簽出之前它是只讀的)。”
我打開了repositories.config文件並添加了一個空行。 然后我添加了我需要的 NuGet 包。 問題解決了。
我總是只簽入packages.config文件夾並使用開發人員(和構建服務器)可以用來在本地更新包的Rake任務。
任務看起來像:
def nuget_for_project(project_dir)
sh "tools\\NuGet.exe " +
"i Source\\#{project_dir}\\packages.config " +
"-o Source\\Packages"
end
namespace :nuget do
desc "nuget for servicebus"
task "ServiceBus" do
nuget_for_project "SampleProject.ServiceBus"
end
desc "nuget for web"
task "Web" do
nuget_for_project "SampleProject.Web"
end
desc "nuget for all"
task "all" => ["nuget:ServiceBus", "nuget:Web"]
end
請注意,上述腳本使用 NuGet.exe 的本地版本,該版本位於檢查到源代碼管理的工具文件夾中。
不久前我寫了一篇較長的 博客文章,這可能會有所幫助。
我必須對這篇文章大喊: http://www.jsinh.in/2013/11/enable-nuget-package-restore/它准確地描述了要做什么以及為什么。
某些系統可能需要對各種包進行版本控制以保持構建一致性,但是,如果 packages.config 文件受版本控制並且可以下載 package,則構建可以隨時進行,而無需對實際 package 內容進行版本控制他們自己。 注意:package 的制造商可能在您不知情的情況下將項目添加到舊版本中。
罕見,但可能。
例如,2.0.2 版本的“abc.package”的 package 已內置到您的項目中。 您不對“abc.package”進行版本控制,而是對 packages.config 進行版本控制。 幾個月后,您需要為幾個月前所做的構建添加錯誤修復。 您使項目脫離版本控制。 Visual Studio 下載 'abc.package' 的 2.0.2 版,但自從您上次構建以來,package 的開發人員插入或修復了一些代碼。 此新代碼在您的應用程序中的行為可能有所不同。
因此,有充分的理由對軟件包進行版本控制!
以防萬一這對任何人都有幫助,我對此的解決方案非常簡單:
在撰寫本文時,這對我來說是一個有 39 個項目的解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.