2017-01-09 136 views
0

我一直在尋找關於如何讓NuGet使用VS2015與GitLab自動恢復軟件包的幾天,而且我沒有運氣。NuGet包不會從VS2015與GitLab恢復

場景: 我從GitLab中克隆了一個空的存儲庫,並使用VS來添加默認的.gitignore和.getattribute文件。我使用.NET框架4.5.2創建了一個HelloWorld控制檯應用程序。我想自動遞增內部版本號,所以我安裝了MSBuild擴展包(在VS的NuGet控制檯中輸入「Install-Package MSBuild.Extension.Pack」)。這會修改CSPROJ文件。然後,我進一步修改了項目文件,以便在每個版本上更新構建版本號和修訂版號。項目文件的淨修改部分看起來是這樣的:

<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> 
<Import Project="..\packages\MSBuild.Extension.Pack.1.8.0\build\net40\MSBuild.Extension.Pack.targets" Condition="Exists('..\packages\MSBuild.Extension.Pack.1.8.0\build\net40\MSBuild.Extension.Pack.targets')" /> 
<Import Project="$(MSBuildProjectDirectory)\..\packages\MSBuild.Extension.Pack.1.8.0\tools\net40\MSBuild.ExtensionPack.VersionNumber.targets" /> 
<Target Name="BeforeBuild" Condition="'$(Configuration)' == 'Release'"> 
    <AssemblyInfo AssemblyInfoFiles="@(AssemblyInfoFiles)" /> 
</Target> 
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> 
    <PropertyGroup> 
    <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText> 
    </PropertyGroup> 
    <Error Condition="!Exists('..\packages\MSBuild.Extension.Pack.1.8.0\build\net40\MSBuild.Extension.Pack.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\MSBuild.Extension.Pack.1.8.0\build\net40\MSBuild.Extension.Pack.targets'))" /> 
</Target> 
<!-- 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> 
--> 

所以我蓋了,它的表現不如預期,我檢查所有在另一臺機器上,我克隆存儲庫並打開該解決方案。該項目不會加載,VS也不會嘗試恢復任何內容;這是錯誤:

C:\Users\mwoodard\Source\Repos\c-sharp-commons\HelloConsole\HelloConsole\HelloConsole.csproj : error : The imported project "C:\Users\mwoodard\Source\Repos\c-sharp-commons\HelloConsole\packages\MSBuild.Extension.Pack.1.8.0\tools\net40\MSBuild.ExtensionPack.VersionNumber.targets" was not found. Confirm that the path in the <Import> declaration is correct, and that the file exists on disk. C:\Users\mwoodard\Source\Repos\c-sharp-commons\HelloConsole\HelloConsole\HelloConsole.csproj 

我看到很多具有的NuGet恢復問題的其他人,和很多的解決方案,但沒有人似乎屬於第一次被使用VS2015開工項目。 (有許多解決方案說,要改變項目或解決方案的.nuget子目錄中的內容... VS2015不會創建這樣的目錄。)

最重要的是,NuGet還原需要在MSBuild中工作,因爲我們的構建機器不會運行Visual Studio。

回答

2

爲了應對無法開解的問題:

使用此代碼,而不是

<Import Project="..\packages\MSBuild.Extension.Pack.1.8.0\tools\net40\MSBuild.ExtensionPack.VersionNumber.targets" Condition="Exists('..\packages\MSBuild.Extension.Pack.1.8.0\tools\net40\MSBuild.ExtensionPack.VersionNumber.targets')" /> 

之後,包將被還原時生成在Visual Studio。 (Enabling and disabling package restore in VS

關於恢復問題:

隨着MSBuild-integrated restore,有在溶液.nuget文件夾。由於您不想將.nuget文件夾包含到解決方案文件夾中,並在構建機器(例如CI)上構建,因此您需要在構建之前恢復該包。

例如,如果通過TFS/VSTS vNext構建構建,則可以添加NuGet恢復構建步驟。對於gitlab CI版本,可以在文件中的before_script部分中恢復包。

+0

謝謝,解決方案工作。您更正的行是在我安裝MSBuild擴展包時由NuGet添加的。順便說一下,這並不是說我不會使用.nuget文件夾,它不是由VS2015爲我創建的,而且我沒有文件來填充它。 –