NuGet 包不会使用 GitLab 从 VS2015 恢复

NuGet Package won't restore from VS2015 with GitLab

我已经搜索了几天关于如何使用 VS2015 和 GitLab 让 NuGet 自动恢复包,但我没有运气。

场景: 我从 GitLab 克隆了一个空的存储库,并使用 VS 添加了默认的 .gitignore 和 .getattribute 文件。我使用 .NET Framework 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 恢复方面遇到问题,并且有很多解决方案,但 none 似乎与最初使用 VS2015 开始的项目有关。 (有很多解决方案说要更改项目或解决方案的 .nuget 子目录中的某些内容...VS2015 不创建此类目录。)

最重要的是,NuGet 恢复需要从 MSBuild 进行,因为我们的构建机器不会 运行 Visual Studio.

解决无法打开问题的解决方案:

改用此代码

<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 构建,您可以在 .gitlab-ci.yml 文件的 before_script 部分恢复包。