簡體   English   中英

多人團隊使用 NuGet 和源代碼控制

[英]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文件現在處於源代碼控制之下(因此在手動簽出之前它是只讀的)。

所以,這是我的兩個問題:

  1. 當我的同事獲取最新信息時,我應該如何或如何簽入以使 NuGet 軟件包對我的同事有效?
  2. 當我需要使用 NuGet 時,有沒有辦法不必手動檢查 NuGet 文件?

我做錯了嗎? 或者 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 文件中所定義。 這發生在預構建步驟中。

所以,簡而言之:

  1. 不要托運包裹
  2. 簽入配置文件(repositories.config 和 packages.config 文件)
  3. 使用啟用 Package 恢復
  4. 簽入.nuget文件夾

每當有人獲得源代碼時,無論是團隊中的其他開發人員還是構建代理,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 的本地版本,該版本位於檢查到源代碼管理的工具文件夾中。

您可以改為為MSBuildNAnt編寫此代碼。

不久前我寫了一篇較長的 博客文章,這可能會有所幫助。

我必須對這篇文章大喊: 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 的開發人員插入或修復了一些代碼。 此新代碼在您的應用程序中的行為可能有所不同。

因此,有充分的理由對軟件包進行版本控制!

以防萬一這對任何人都有幫助,我對此的解決方案非常簡單:

  1. 記事本++中打開目標文件
  2. 在編輯菜單中,一路底部,點擊清除只讀標志
  3. 保存文件
  4. 利潤

在撰寫本文時,這對我來說是一個有 39 個項目的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM