Как правильно сделать «публикацию dotnet» на Project1 перед сборкой Project2? - PullRequest
0 голосов
/ 12 октября 2018

У меня есть решение с 2 проектами.Один - это VSIX, а другой - консольное приложение .NET Core 2.1.

Проекты не зависят напрямую друг от друга, но я должен убедиться, что VSIX встраивает свежую версию всех выходных файлов из другогопроект, как он построен, потому что он понадобится во время выполнения.

Включение в событие после сборки проекта VSIX, используемого для работы:

cd "$(SolutionDir)MyCoreConsoleApp"
dotnet publish --configuration $(Configuration)

Стоит отметить, чтовначале были некоторые странные проблемы с этой настройкой, хотя ... Консольное приложение могло бы быть хорошо скомпоновано, если бы оно выполнялось путем непосредственного перестроения проекта из Solution Explorer.С другой стороны, выдача dotnet publish из пакета VSIX, предшествующего сборке, приведет к сбою с ошибками, в основном говоря, что система сборки не может найти все необходимые файлы.

После долгих усилий я решил, что проблемаВ тот момент консольное приложение использовало Fody Costura.После удаления этой зависимости dotnet publish начал работать без проблем.

Перенесемся во вчерашний день ... Я добавил зависимость от задач сообщества MSBuild в консольный проект приложения, потому что я хотел использовать задачу Zip для встраиваниясжатая копия некоторых файлов содержимого как EmbeddedResource.Я добавил пользовательскую цель в csproj и подтвердил, что она работает правильно при прямой компоновке проекта или при выдаче dotnet publish из командной строки.В случае, если это имеет значение, сама цель выглядит так:

<Target Name="ZipAndEmbedWwwRoot" BeforeTargets="BeforeBuild">
  <CreateItem Include="wwwroot\**\*">
    <Output ItemName="ZipFiles" TaskParameter="Include" />
  </CreateItem>
  <Zip ZipFileName="$(IntermediateOutputPath)wwwroot.zip" WorkingDirectory="wwwroot" Files="@(ZipFiles)" />
  <ItemGroup>
    <EmbeddedResource Include="$(IntermediateOutputPath)wwwroot.zip">
      <LogicalName>wwwroot.zip</LogicalName>
    </EmbeddedResource>
  </ItemGroup>
</Target>

Но теперь сборка VSIX снова стала давать сбой.Ошибка:

Не удалось загрузить задачу «MSBuild.Community.Tasks.Zip» из сборки C: \ Users \ MyUserName \ .nuget \ packages \ msbuildtasks \ 1.5.0.235 \ build\ .. \ Tools \ MSBuild.Community.Tasks.dll.Не удалось загрузить файл или сборку «Microsoft.Build.Utilities.v4.0, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = b03f5f7f11d50a3a».Система не может найти указанный файл.Убедитесь, что объявление правильное, что сборка и все ее зависимости доступны и что задача содержит открытый класс, который реализует Microsoft.Build.Framework.ITask.

Как только я удалюПользовательская цель, все снова начинает работать.

Я начинаю думать, что, возможно, что-то упускаю при вызове dotnet publish в проекте, который имеет дополнительные зависимости msbuild.Вероятно, это и было причиной того, что Фоди Костура тоже не работал.

Итак, вопрос в том, как должен делать это, тогда?

1 Ответ

0 голосов
/ 12 октября 2018

Задача сообщества Zip довольно старая и больше не работает с последними версиями MSBuild или кроссплатформенной dotnet CLI.

Однако в VS 2017 15.8 и CLI 2.1.400 введены встроенныев ZipDirectory задача вы можете использовать вместо.

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