Pull to refresh

Comments 11

Полезно. Использовал таск RemoveDir для очистки Obj папки для мультитаргет проекта (Core и Full Framework) с целью избежания ошибки сборки. В статью можно добавить подобные реальные примеры использования.
Обычно это через установку переменной Platform делается…
Установка этой переменной(x86, x64) может очистить папку Obj?
P.S. Проблема в том, что если первый раз собрать проект под .Net Core, а затем под полный фреймворк, то, если не очищать папку Obj, появляется ошибка «Your project is not referencing the .NETFramework..». Причём только если собирать из Visual Studio. Через dotnet build всё проходит.
Установка этой переменной поможет использовать разные дочерние папки для сборки в разных платформах. Только выставлять ее надо не в x86/x64, а в какой-нибудь Core/Full (и еще надо выставить PlatformTarget в AnyCPU чтобы значение Platform не влияло на целевую архитектуру).

Ну или можно просто установить свое значение для IntermediateOutputPath…
Вот только простая установка (Base)IntermediateOutputPath не решает проблему. project.assets.json и другие файлы продолжают генерироваться в стандартной папке Obj. Чтобы этого избежать, приходится устанавливать (Base)IntermediateOutputPath перед импортом Sdk.props, т.к. MSBuildProjectExtensionsPath(который устанавливает путь к project.assets.json) берет путь BaseIntermediateOutputPath (по умолчанию Obj) до импорта.
<Project>
  <PropertyGroup>
    <BaseIntermediateOutputPath>objCore</BaseIntermediateOutputPath>
  </PropertyGroup>
 <Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" />
    <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
    </PropertyGroup>
 <Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
...    
</Project>
Ну конечно же переменную надо менять перед тем как она используется, а не после! Я считал это очевидным :-)
К сожалению, рассмотрение реальных примеров использования выходит за рамки статьи. Придется описывать проблему полностью, это может отвлечь от темы. Идея была сделать статью, в которой будут даны основные понятия о таргетах и тасках, чтобы затем на основе нее можно было рассматривать конкретные примеры использования. Например, я планирую написать еще 2 статьи касательно трансформаций конфигов (одну про solution конфигурации, вторую про трансформации конфигов), а для этого мне пришлось написать эту статью про MSBuild. Я постарался сделать ее максимально самостоятельной, чтобы можно было давать на нее ссылки в различных ситуациях.

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

Стоило привести пример с GenerateResource. Так как это довольно запутанный таск.

Что бы увидеть полный список всех таргетов для вашего проекта, натравите msbuild на ваш проект с параметром /pp: кудасохранитьвывод.xml. выводом будет полностью сконфигурированный файл таргетов со всеми импортами. более десяти тысяч строк, четырехсот таргетов и шестисот параметров.
Спасибо за информацию. Добавил в статью.
Sign up to leave a comment.

Articles