【问题标题】:Why does msbuild 15 not recognize the pack target, if it recognizes the restore target just fine?为什么 msbuild 15 不能识别 pack 目标,如果它可以很好地识别还原目标?
【发布时间】:2018-11-19 01:37:15
【问题描述】:

所以我可以很好地恢复和构建:

C:\xyz\MyApp [master ↑1]> git clean -qdfx
C:\xyz\MyApp [master ↑1]> msbuild /t:restore
Microsoft (R) Build Engine version 15.8.169+g1ccb72aefa for .NET Framework
Copyright (C) Microsoft Corporation. All rights reserved.

Building the projects in this solution one at a time. To enable parallel build, please add the "/m" switch.
Build started 11/18/2018 8:24:37 PM.
Project "C:\xyz\MyApp\MyApp.sln" on node 1 (Restore target(s)).
ValidateSolutionConfiguration:
  Building solution configuration "Debug|Any CPU".
Restore:
  Restoring packages for C:\xyz\MyApp\MyApp\MyApp.csproj...
  Restoring packages for C:\xyz\MyApp\MyAppFileTool\MyAppFileTool.csproj...
  Restoring packages for C:\xyz\MyApp\MyAppHelper\MyAppHelper.csproj...
  Committing restore...
  Committing restore...
  Committing restore...
  Generating MSBuild file C:\xyz\MyApp\MyAppFileTool\obj\MyAppFileTool.csproj.nuget.g.props.
  Generating MSBuild file C:\xyz\MyApp\MyApp\obj\MyApp.csproj.nuget.g.props.
  Generating MSBuild file C:\xyz\MyApp\MyAppHelper\obj\MyAppHelper.csproj.nuget.g.props.
  Generating MSBuild file C:\xyz\MyApp\MyAppFileTool\obj\MyAppFileTool.csproj.nuget.g.targets.
  Generating MSBuild file C:\xyz\MyApp\MyApp\obj\MyApp.csproj.nuget.g.targets.
  Generating MSBuild file C:\xyz\MyApp\MyAppHelper\obj\MyAppHelper.csproj.nuget.g.targets.
  Writing lock file to disk. Path: C:\xyz\MyApp\MyApp\obj\project.assets.json
  Writing lock file to disk. Path: C:\xyz\MyApp\MyAppFileTool\obj\project.assets.json
  Writing lock file to disk. Path: C:\xyz\MyApp\MyAppHelper\obj\project.assets.json
  Restore completed in 367.2 ms for C:\xyz\MyApp\MyAppHelper\MyAppHelper.csproj.
  Restore completed in 367.46 ms for C:\xyz\MyApp\MyApp\MyApp.csproj.
  Restore completed in 367.02 ms for C:\xyz\MyApp\MyAppFileTool\MyAppFileTool.csproj.

  NuGet Config files used:
      C:\Users\myself\AppData\Roaming\NuGet\NuGet.Config
      C:\Program Files (x86)\NuGet\Config\Microsoft.VisualStudio.Offline.config

  Feeds used:
      https://api.nuget.org/v3/index.json
      C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\
Done Building Project "C:\xyz\MyApp\MyApp.sln" (Restore target(s)).


Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:01.01
C:\xyz\MyApp [master ↑1]> msbuild /m /v:m
Microsoft (R) Build Engine version 15.8.169+g1ccb72aefa for .NET Framework
Copyright (C) Microsoft Corporation. All rights reserved.

  MyAppHelper -> C:\xyz\MyApp\MyAppHelper\bin\Debug\MyAppHelper.dll
  MyApp -> C:\xyz\MyApp\MyApp\bin\Debug\MyApp.exe
  MyAppFileTool -> C:\xyz\MyApp\MyAppFileTool\bin\Debug\MyAppFileTool.exe

因此,我希望 pack 目标也可以工作,但事实并非如此:

C:\xyz\MyApp [master ↑1]> msbuild /t:pack
Microsoft (R) Build Engine version 15.8.169+g1ccb72aefa for .NET Framework
Copyright (C) Microsoft Corporation. All rights reserved.

Building the projects in this solution one at a time. To enable parallel build, please add the "/m" switch.
Build started 11/18/2018 8:24:55 PM.
Project "C:\xyz\MyApp\MyApp.sln" on node 1 (pack target(s)).
ValidateSolutionConfiguration:
  Building solution configuration "Debug|Any CPU".
Project "C:\xyz\MyApp\MyApp.sln" (1) is building "C:\xyz\MyApp\MyAppFileTool\MyAppFileTool.csproj" (2) on node 1 (pack target(s)).
C:\xyz\MyApp\MyAppFileTool\MyAppFileTool.csproj : error MSB4057: The target "pack" does not exist in the project.
Done Building Project "C:\xyz\MyApp\MyAppFileTool\MyAppFileTool.csproj" (pack target(s)) -- FAILED.

Project "C:\xyz\MyApp\MyApp.sln" (1) is building "C:\xyz\MyApp\MyApp\MyApp.csproj" (3) on node 1 (pack target(s)).
C:\xyz\MyApp\MyApp\MyApp.csproj : error MSB4057: The target "pack" does not exist in the project.
Done Building Project "C:\xyz\MyApp\MyApp\MyApp.csproj" (pack target(s)) -- FAILED.

Project "C:\xyz\MyApp\MyApp.sln" (1) is building "C:\xyz\MyApp\MyAppHelper\MyAppHelper.csproj" (4) on node 1 (pack target(s)).
C:\xyz\MyApp\MyAppHelper\MyAppHelper.csproj : error MSB4057: The target "pack" does not exist in the project.
Done Building Project "C:\xyz\MyApp\MyAppHelper\MyAppHelper.csproj" (pack target(s)) -- FAILED.

Done Building Project "C:\xyz\MyApp\MyApp.sln" (pack target(s)) -- FAILED.


Build FAILED.

"C:\xyz\MyApp\MyApp.sln" (pack target) (1) ->
"C:\xyz\MyApp\MyAppFileTool\MyAppFileTool.csproj" (pack target) (2) ->
  C:\xyz\MyApp\MyAppFileTool\MyAppFileTool.csproj : error MSB4057: The target "pack" does not exist in the project.


"C:\xyz\MyApp\MyApp.sln" (pack target) (1) ->
"C:\xyz\MyApp\MyApp\MyApp.csproj" (pack target) (3) ->
  C:\xyz\MyApp\MyApp\MyApp.csproj : error MSB4057: The target "pack" does not exist in the project.


"C:\xyz\MyApp\MyApp.sln" (pack target) (1) ->
"C:\xyz\MyApp\MyAppHelper\MyAppHelper.csproj" (pack target) (4) ->
  C:\xyz\MyApp\MyAppHelper\MyAppHelper.csproj : error MSB4057: The target "pack" does not exist in the project.

    0 Warning(s)
    3 Error(s)

Time Elapsed 00:00:00.27
C:\xyz\MyApp [master ↑1]>

怎么了?

编辑 1

我刚刚创建了一个新的 .NET Standard 项目,restorepack 都可以正常工作。有问题的解决方案是我在 Visual Studio 2017 的帮助下转换为使用 PackageReference 的 .NET Framework 4.7.2 解决方案。我没有手动执行任何操作。

【问题讨论】:

  • 为什么需要添加msbuild社区任务? msbuild 15 不应该开箱即用地支持它吗? restore 目标有效,因此显然有 NuGet 支持。

标签: msbuild visual-studio-2017 nuget


【解决方案1】:

我绝不是 MSBuild 专家,但我相信这比说 NuGet 与 MSBuild 集成要复杂得多。我不相信 MSBuild 15 有内置的 NuGet 知识,甚至是还原目标,这可以通过创建一个空的 MSBuild 项目文件<Project></Project> 来确认。运行msbuild /t:restore,看到错误信息说没有目标还原。

因此,还原目标实际上并未内置到 msbuild.exe 中,而是实际定义在您的项目正在使用的目标文件中。因此,为了定义一个打包目标,您需要导入一个不同的目标文件。

从不太理论、更实用的角度来看,“旧”样式的 csproj 文件(导入 Microsoft.Common.CSharp.targets 或类似文件的文件)没有定义打包目标,但新的 SDK 样式的项目可以.

因此,为了能够从 msbuild 打包,您需要迁移到 SDK 样式的项目。有些人有一种误解,认为您需要以 .NET Core 为目标才能使用 SDK 样式的项目,但事实并非如此。 SDK 风格的项目与 .NET Core 同时可用,而 .NET Core 项目需要 SDK 风格的项目,但您仍然可以以 .NET Framework 为目标。

【讨论】:

  • 你是对的,“C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\CommonExtensions\Microsoft\NuGet\NuGet.targets”不包括@ 987654326@ 目标,但它确实包含restore 目标。所以,据我了解,我必须迁移到一个新的 SDK 风格的项目。怎么样?
  • 没有一刀切的方法。如果您的程序集是一个基本类库,我建议创建一个新的 .NET Core 类库项目,将项目的 csproj 替换为新项目模板中的 csproj,然后执行重新构建项目所需的操作。 Here's an old blog post 以及其他一些建议。
  • 今天早上我与我的团队交谈,并被告知 dotnet cli 引入了自己的目标,因此如果您安装了它,dotnet pack 可能会工作,即使 msbuild /t:pack 没有。我现在没有时间自己尝试,但想提供另一种选择以防万一。
  • 不,dotnet pack 失败并显示相同的消息 - 目标 pack 不存在。
  • 我正在尝试使用工具进行迁移,也许您也可以在这里帮助我? stackoverflow.com/questions/53368555/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-29
  • 1970-01-01
  • 2017-03-23
  • 1970-01-01
  • 2018-11-16
相关资源
最近更新 更多