忽略 .NetCore 运行时标识符参数、MSBuild、Team City

.NetCore runtime identifier parameters ignored, MSBuild, Team City

我在尝试通过 Team City 构建和发布 MSBuild 时遇到了问题。收到的错误消息如下:

C:\Program Files\dotnet\sdk.2.402\Sdks\Microsoft.NET.Sdk\targets\Microsoft.PackageDependencyResolution.targets(208, 5): error NETSDK1047: Assets file 'F:\TeamCity\buildAgent\workf1e0cb4e5e5076f\myproject\obj\project.assets.json' doesn't have a target for '.NETCoreApp,Version=v2.2/win-x64'. Ensure that restore has run and that you have included 'netcoreapp2.2' in the TargetFrameworks for your project. You may also need to include 'win-x64' in your project's RuntimeIdentifiers.

我原以为将以下参数传递给 MSBuild 应该可以解决问题。

/p:TargetFramework=netcoreapp2.2 /p:Runtimeidentifier=win-x64

然而事实并非如此。

我可以从 Visual Studio 中 build/publish 项目,但不能通过 Team City 构建代理。

为了让构建代理达到 build/publish,我必须在项目 .csproj 文件中声明运行时标识符:

<PropertyGroup>
    <TargetFramework>netcoreapp2.2</TargetFramework>
    <RuntimeIdentifier>win-x64</RuntimeIdentifier>
</PropertyGroup>

在我看来,要么 Team City 忽略了 MSBuild 参数,我的参数不正确,要么 Visual Studio 正在执行我不知道的额外步骤以在发布时声明运行时标识符(通过 WebDeploy)。

我显然已经解决了我遇到的问题,但这似乎不是 'correct' 的解决方法。我错过了什么?

谢谢,

I've obviously resolved the issue I was having, but this doesn't seem to be the 'correct' way of doing it. What am I missing?

你可能会从this blog得到一些帮助,project.assets.json列出了项目的所有依赖项

当您在 VS 中创建一个新的 .net core 项目时,它会为您创建这个文件。用记事本打开可以发现默认没有指定运行时间:

当您尝试通过 msbuild 命令行使用 /p:Runtimeidentifier=win-x64 构建它时,msbuild 无法识别 运行 时间,因为它未在 projects.assets.json 文件中定义。

解决此问题的一种简单方法是在使用 Runtimeidentifier=xxx.

指定命令时添加 -restore 开关

所以实际上您需要将以下参数传递给 msbuild,无需手动编辑 xx.csproj 文件:

/p:TargetFramework=xxx /p:Runtimeidentifier=xxx /restore

Msbuild 将在 运行 build 目标之前执行 restore 目标,而 restore 目标将重新生成一个新的 projects.assets.json 文件用于 win- 64,见:

解决方案:

所以正确的方法是在你的构建命令中添加一个restore开关,那么无论你要针对哪个Runtimeidentifier构建都会成功。避免手动编辑项目文件中的 Runtimeidentifier

至于为什么会起作用 VS:VS 会在我们使用Publish功能时(右键项目=>Publish)自动为我们做还原工作。我们可以很容易地在路径 ProjectFolder\obj\publish\win-x64 中找到 win-64 的 projects.assets.json,因此当您从 VS 发布时它会成功。嗯,是IDE的魅力吧?

您使用哪个构建步骤(build runner)来构建项目?在它之前是否有 NuGet Installer 步来恢复项目依赖项所需的所有内容?如果你使用 MSBuildVisual Studio runner,你需要添加它(据我所知, .NET CLI 和 "dotnet build" 命令将默认恢复,你不需要额外的一步)。