2013-05-20 74 views
3

我已經和NuGet搏鬥了幾天,現在我正在轉向StackOverflow,希望這裏的某個人能夠友好地指引我朝着正確的方向前進。是否有可能使NuGet.exe運行與Visual Studio斷開連接?

我已經使用NuGet幾次簡單的單人寵物項目,但這是我第一次將它用於我真正關心的事情,並希望有完全連續的構建等。創建一個簡單的NAnt構建腳本來獲取Git的源代碼,確保外部依賴關係已被取消,編譯並運行測試 - vanilla CI。

我最初走的路試圖獲得解決方案恢復工作,但它只是沒有工作,或者我沒有如何工作。 Visual Studio不在構建服務器上,並且不會安裝在那裏 - 這不是一個選項。順便說一句,我不能讓解決方案恢復工作,只需兩個開發人員(一個試圖降低源代碼並乾淨地構建)。我假設這是因爲「允許解決方案恢復」必須在任何地方打開(並且不是默認情況下)。在我深入研究之前,我對這種方法進行了處理 - 坦率地說,讓我的軟件包管理器與IDE緊密結合使我感到不舒服,並希望能以另一種方式做到這一點。我習慣使用的包管理器是簡單的命令行工具 - CI構建腳本在構建時調用它,開發人員按需執行。我花了最近兩個小時試圖在NuGet源代碼中使用最近30分鐘的工作。我覺得我正在與該工具作鬥爭並需要重新啓動。

有沒有人有任何在多開發人員+ CI場景中使用NuGet的例子?這就是我想要的:

  1. 任何及所有的開發者可以得到源和3次或更少的 點擊(優選1)運行測試。如果二進制文件不在本地存在,那將被JIT提取。如果他們在那裏,他們會根據需要進行更新等等。理想情況下,甚至不需要安裝NuGet(即NuGet.exe需要在我的回購庫中)。
  2. 通過像Jenkins,TeamCity等CI服務器執行#1(最好使用相同的腳本)
  3. 如果它不過度對抗工具,我希望所有這些從Visual Studio中斷開連接, .config文件和所有二進制文件轉儲到repo根目錄中的單個Lib文件夾中。

任何指針將非常感激。

回答

0

下面,我怎麼覺得你可以實現每個先決條件:

  1. 你需要「啓用NuGet包還原」,在您的解決方案:http://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages
  2. As @ alexander-doroshenko爲TeamCity提到,您可以使用Nuget安裝程序:http://confluence.jetbrains.com/display/TCD7/NuGet+Installer,但是如果您希望在Jenkins中運行腳本,請爲每個項目嘗試以下操作(作爲TC工作,作爲命令行步驟):

    nuget.exe安裝「[Project folder]/packages」。配置」 -source‘’-solutionDir‘’-OutputDirectory‘套餐’

  3. 這必要將項目1和2進行

+0

這聽起來像只是想我需要......如果它來自JetBrains我希望它會工作,並易於使用。 – kellyb

0

有集成的NuGet到您的構建過程中的幾個不同的解決方案取決於你需要多少集成,在我們的例子中,我們希望使用NuGet作爲包管理器,並允許開發人員構建他們的解決方案,即使他們沒有在他們的機器上安裝NuGet,爲了這個工作,我們啓用了包恢復, NuGet二進制文件到您的解決方案文件夾並更新項目文件請注意,NuGet並不總是正確地更新項目文件。在我們的案例中,我們發現一些項目文件去噸更新,但其他人沒有。要驗證項目是否已更新,您需要以XML文件的形式打開項目文件。爲了實現這個負載的解決方案,並右鍵點擊相關項目並選擇卸載項目。然後再次右鍵單擊該項目並選擇編輯[PROJECT_NAME]。在項目文件中,您應該看到

  • A RestorePackages第一個屬性組中的屬性。此屬性的值應爲true
  • 在項目文件的最後一個import語句。這個導入語句應該指向NuGet二進制文件附帶的'NuGet.targets文件。

下面是我們的項目文件(大量編輯)

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
    <SolutionDir Condition="'$(SolutionDir)' == '' or '$(SolutionDir)' == '*undefined*'">$(MSBuildProjectDirectory)\..</SolutionDir> 
    <ProjectGuid>{8B467882-7574-41B2-B3A8-2F34DA84BE82}</ProjectGuid> 
    <OutputType>Library</OutputType> 
    <RootNamespace>MyCompany.MyNamespace</RootNamespace> 
    <AssemblyName>MyCompany.MyNamespace</AssemblyName> 

    <!-- Allow NuGet to restore the packages if they are missing --> 
    <RestorePackages>true</RestorePackages> 
    </PropertyGroup> 
    <Import Project="$(SolutionDir)\BaseConfiguration.targets" /> 
    <ItemGroup> 
    <Reference Include="System" /> 
    <Reference Include="System.Core" /> 
    </ItemGroup> 
    <ItemGroup> 
    <Compile Include="MyClass.cs" /> 
    <!-- 
     .... MANY MORE FILES HERE 
    --> 
    </ItemGroup> 

    <!-- Import the Nuget.targets file which integrates NuGet in the build process --> 
    <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" /> 
    <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
     Other similar extension points exist, see Microsoft.Common.targets. 
    <Target Name="BeforeBuild"> 
    </Target> 
    <Target Name="AfterBuild"> 
    </Target> 
    --> 
</Project> 

你需要採取的下一步是提供解決方案級別的NuGet配置文件的一個示例中,你會指出需要「安裝」軟件包的位置以及package repository的URL是什麼。在我們的情況下,解決方案目錄結構如下:

(D) root 
    (D) build 
    (D) packages 
    (D) source 
     (D) .nuget 
      NuGet.config 
      NuGet.exe 
      NuGet.targets 
     (D) MyCoolProject 
      MyCoolProject.csproj 
     MyCoolProject.sln 
    (D) templates 
    NuGet.Config 

(D)表示目錄。

NuGet.config文件包含以下配置設置。

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <packageRestore> 
    <add key="enabled" value="True" /> 
    </packageRestore> 
    <config> 
    <add key="repositorypath" value="packages" /> 
    </config> 
    <packageSources> 
    <add key="OurPackageServer" value="PACKAGE_SERVER_ADDRESS" /> 
    </packageSources> 
    <activePackageSource> 
    <add key="All" value="(Aggregate source)" /> 
    </activePackageSource> 
</configuration> 

該配置文件指示包恢復被啓用,該儲存庫路徑(其中,包被放置)是包目錄和包源是活動的。

通過在根目錄下放置一個NuGet.config文件,我們可以在NuGet中使用hierarchical configuration選項。這允許單個解決方案覆蓋計算機特定的配置。另一個好處是,這樣我們就不需要在構建服務器上安裝NuGet(因爲可執行文件和配置在存儲庫中)。

通過此設置,開發人員可以從Visual Studio構建解決方案。即使沒有安裝NuGet,構建也可以在開發人員機器上正常工作。但是請注意,如果沒有在Visual Studio中安裝NuGet,他們將無法將包添加到項目中。 在構建服務器上,您可以簡單地使用MsBuild構建解決方案,該解決方案將自動從軟件包存儲庫下載軟件包。 Visual Studio不需要安裝在構建計算機上(只是您選擇的.NET框架)。

+0

我非常感謝詳細的解釋。這聽起來與我正在走下的路徑非常相似。我相信我可以最終實現這個目標,但是這比我想要的更復雜(多個配置文件和voodoo路徑解析,依賴於Visual Studio等)。我寧願讓一些簡單的東西 - 單個文件充當清單,並且有一件事情可以閱讀並完成任務。我會檢查JetBrains的東西......謝謝你們。 – kellyb

相關問題