TeamCity 中引用 nuget 包的项目构建失败的解决方案,该包将条件条目添加到各种 .targets 和 .props 文件的 .csproj 文件中。在 Visual Studio 中工作没有问题。
有人知道问题是什么或者修复/解决方法是什么吗?我可以完全注释掉该部分,并且构建可以毫无问题地进行。 TeamCity 支持这些类型的检查吗?
许多人似乎遇到了这些目标的问题,这里分享了挫败感,但这不是在 TeamCity 的背景下 -> https://github.com/NuGet/Home/issues/3320
TeamCity 构建步骤
TeamCity 构建错误:
请注意,我可以移动条目,无论哪个是第一个都会导致构建失败。
C:\TeamCity\buildAgent\work\4z4520g0d4f45ge5\test\MyCompany.SomeProject\src\MyCompany.SomeProject.Test\MyCompany.SmokeTests.Test.csproj(114, 5):
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 ..\..\packages\MSTest.TestAdapter.1.3.2\build\net45\MSTest.TestAdapter.props.
触发错误的项目 (.csproj) 内容
<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\MSTest.TestAdapter.1.3.2\build\net45\MSTest.TestAdapter.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\MSTest.TestAdapter.1.3.2\build\net45\MSTest.TestAdapter.props'))" />
<Error Condition="!Exists('..\..\packages\MSTest.TestAdapter.1.3.2\build\net45\MSTest.TestAdapter.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\MSTest.TestAdapter.1.3.2\build\net45\MSTest.TestAdapter.targets'))" />
<Error Condition="!Exists('..\..\packages\NUnit.3.13.3\build\NUnit.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\NUnit.3.13.3\build\NUnit.props'))" />
<Error Condition="!Exists('..\..\packages\NUnit3TestAdapter.4.5.0\build\net462\NUnit3TestAdapter.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\NUnit3TestAdapter.4.5.0\build\net462\NUnit3TestAdapter.props'))" />
<Error Condition="!Exists('..\..\packages\Selenium.WebDriver.4.13.1\build\Selenium.WebDriver.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\Selenium.WebDriver.4.13.1\build\Selenium.WebDriver.targets'))" />
<Error Condition="!Exists('..\..\packages\OctoPack.3.6.5\build\OctoPack.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\OctoPack.3.6.5\build\OctoPack.targets'))" />
</Target>
背景:
我已经成功使用 TeamCity 构建了相当大的 Visual Studio 2017 .sln 文件 7 年,没有出现任何问题。我正在向此存储库添加一个新的 .sln 文件,以保存用于硒测试的辅助项目。这个新解决方案包含一个项目,其中包含对多个 nuget 包的引用,这些包都将标签添加到 .csproj 项目文件中。这些标签位于“EnsureNuGetPackageBuildImports”节点中。此节点中的任何条目都会失败并出现构建错误,就像我上面提到的那样。
我自己找到了问题,并将离开这里,以防其他人将来遇到类似的问题。我在 CI/CD 内部构建时看到的错误是准确的,当从源代码管理引用包时,从 .csproj 文件引用的一些文件确实丢失了。问题是我们的 .gitignore 对某些 nuget 包中可能存在的“build”文件夹有一个特定的 unignore。我在源代码管理文件夹层次结构的子目录中放置了一个新的包文件夹,而 unignore 不适用于该子目录,因此我意外地从“build”文件夹中排除了一些 nuget 包资源。添加了一个新条目,以在新目录层次结构中取消忽略此文件夹,并且一旦提交到源代码控制,在构建服务器上的 TeamCity 内部构建时就不会出现任何问题。