Почему msbuild 15 не распознает цель пакета, если она распознает цель восстановления просто отлично? - PullRequest
0 голосов
/ 19 ноября 2018

Так что я могу восстановить и собрать просто отлично:

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

Поэтому я ожидаю, что цель пакета тоже будет работать, но это не так:

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, и там и restore, и pack работают нормально.Данное решение представляет собой решение .NET Framework 4.7.2, которое я преобразовал для использования PackageReference с помощью Visual Studio 2017. Я ничего не делал вручную.

1 Ответ

0 голосов
/ 19 ноября 2018

Я ни в коем случае не эксперт MSBuild, но я считаю, что это сложнее, чем сказать, что NuGet интегрирован с MSBuild. Я не верю, что MSBuild 15 обладает встроенными знаниями NuGet, даже целью восстановления, что можно подтвердить, создав пустой файл проекта MSBuild <Project></Project>. Запустите msbuild /t:restore и увидите сообщение об ошибке, в котором говорится, что нет целевого восстановления.

Следовательно, цель восстановления на самом деле не встроена в msbuild.exe, а определена в файле целей, который использует ваш проект. Поэтому для определения цели пакета необходимо импортировать другой целевой файл.

С менее теоретической, более практичной, точки зрения, файлы csproj «старого» стиля (которые импортируют Microsoft.Common.CSharp.targets или что-то в этом роде) не определяют цель пакета, но новые проекты в стиле SDK делают .

Поэтому, чтобы иметь возможность упаковать из msbuild, вам нужно перейти на проекты в стиле SDK. Некоторые люди ошибочно полагают, что для использования проектов в стиле SDK необходимо настроить таргетинг на .NET Core, что неверно. Проекты в стиле SDK стали доступны одновременно с .NET Core, а для проектов .NET Core нужны проекты в стиле SDK, но вы все равно можете ориентироваться на .NET Framework.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...