Параметры идентификатора среды выполнения .NetCore игнорируются, MSBuild, Team City - PullRequest
1 голос
/ 01 октября 2019

У меня были проблемы при попытке создать и опубликовать MSBuild через Team City. Полученное сообщение об ошибке было следующим:

C:\Program Files\dotnet\sdk\2.2.402\Sdks\Microsoft.NET.Sdk\targets\Microsoft.PackageDependencyResolution.targets(208, 5): error NETSDK1047: Assets file 'F:\TeamCity\buildAgent\work\9f1e0cb4e5e5076f\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, но не через агента сборки Team City.

Для того, чтобы получить агент сборки для сборки / публикации, мне пришлось в проект.csproj файл и объявить идентификатор времени выполнения:

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

Мне кажется, что либо Team City игнорирует параметры MSBuild, у меня неверные параметры, либо Visual Studio выполняет дополнительный шаг. не в курсе объявления идентификатора среды выполнения при публикации (через WebDeploy).

Я, очевидно, решил проблему, с которой столкнулся, но это, похоже, не является «правильным» способом сделать это. Чего мне не хватает?

Спасибо,

Ответы [ 2 ]

3 голосов
/ 02 октября 2019

Я, очевидно, решил проблему, с которой столкнулся, но, похоже, это не «правильный» способ сделать это. Чего мне не хватает?

Вы можете получить некоторую помощь от этого блога , project.assets.json перечисляет все зависимости проекта.

Когда вы создаете новый проект .net core в VS, он создаст этот файл для вас. Откройте его с помощью блокнота, и вы можете обнаружить, что он не определяет время выполнения по умолчанию:

enter image description here

Когда вы пытаетесь построить его с помощью командной строки msbuild с/p:Runtimeidentifier=win-x64, тогда msbuild не может распознать эту среду выполнения, поскольку она не определена в файле projects.assets.json.

Простой способ обойти эту проблему - добавить переключатель -restore, когда вы указываете команду сRuntimeidentifier=xxx.

Так что на самом деле вам нужно передать следующие параметры в msbuild, нет необходимости вручную редактировать файл xx.csproj:

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

Msbuild выполнит цель restoreперед выполнением цели build, цель restore создаст новый файл projects.assets.json для win-64, см .:

enter image description here

Решение :

Таким образом, правильный способ - добавить ключ restore в вашу команду сборки, тогда сборка будет успешной независимо от того, на какой Runtimeidentifier вы хотите нацелиться. Избегайте ручного редактирования Runtimeidentifier в файле проекта!

Что касается того, почему он работает в VS: VS выполнит восстановление автоматически за нас, когда мы используем функцию публикации (щелкните правой кнопкой мыши проект => Опубликовать). Мы можем легко найти projects.assets.json для win-64 по пути ProjectFolder\obj\publish\win-x64, поэтому он успешно выполняется при публикации из VS. Хм, это прелесть IDE, верно?

0 голосов
/ 02 октября 2019

Какой шаг сборки (сборщик бега) вы используете для сборки проекта? Есть ли у вас шаг NuGet Installer перед ним, чтобы восстановить все необходимые для проекта зависимости? Вам нужно добавить его, если вы используете MSBuild или Visual Studio runner (насколько я знаю, команды .NET CLI и "dotnet build" будут восстановлены по умолчанию, и вам не понадобится дополнительный шаг для этого).

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