忽略 .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
步来恢复项目依赖项所需的所有内容?如果你使用 MSBuild
或 Visual Studio
runner,你需要添加它(据我所知, .NET CLI
和 "dotnet build" 命令将默认恢复,你不需要额外的一步)。
我在尝试通过 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
步来恢复项目依赖项所需的所有内容?如果你使用 MSBuild
或 Visual Studio
runner,你需要添加它(据我所知, .NET CLI
和 "dotnet build" 命令将默认恢复,你不需要额外的一步)。