Re[7]: скопировать в outputdir фал xml документации
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 08.12.22 09:50
Оценка: 122 (2)
Здравствуйте, Sinclair, Вы писали:

S>Михаил, у меня оффтоп-вопрос: как вы во всём этом разбираетесь?

Не очень быстро, увы, и не всегда успешно...

На самом деле, сам MSBuild не очень сложный. Это, конечно, не Lisp (надеюсь меня не закидают за такое сравнение), но в нем базовых конструкций очень немного:
— targets
— tasks
— properties
— items + items metadata + metadata transformation
— conditions (условное выполнение)

Если в общих чертах понять как они между собой связаны, то читать MSBuild становится гораздо проще.
Более того, на самом деле документация по MSBuild вполне себе приличная. Но она именно документация, т.е. когда вы знаете что искать и вам просто нужны детали. Типа какие есть встроенные метаданные у items.

Я не смотрел полностью виде Никиты, на которое дали ссылку в соседнем ответе, но в свое время я делал похожее введение (только у меня как обычно — более академично и более тяжеловесно) для коллег в EPAM и там основы с небольшими демками укладывались примерно в часовой рассказ (я, кстати, хотел свои записанные лекции повыкладывать во вне, но мне сказали "не позорь контору" и я не стал).

В общем, если познакомиться с неким базовым Tutorial, то дальше будет гораздо проще.

S>Как вы понимаете, что и куда нужно добавлять?

Ну, честно признаюсь, что далеко не всегда я таки понимаю, что делать в MSBuild, даже с учетом имеющейся практики
Обычно выручает следующее:
1. Знание как строятся связи между targets в тех MSBuild, которые поставляет MS. А именно, что в property вида XXXDependsOn записываются те targets, от которых зависит текущая:
<PropertyGroup>
  <PackageDependsOn Condition="'$(PackageDependsOn)'==''">
    PipelineCopyAllFilesToOneFolderForMsdeploy;
    ImportPublishingParameterValues;
    PipelineMsdeploySpecificTransformPhase;
  </PackageDependsOn>
</PropertyGroup>
<Target Name="Package"
          Condition="$(_CreatePackage)"
          DependsOnTargets="$(PackageDependsOn)">
</Target>

Таким образом можно начать раскручивать с конца — что от чего зависит

2. Просто офигенный инструмент от Кирилла ОсенковаMSBuild Binary and Structured Log Viewer!
Просто ставите себе этот вьюер, затем запускаете msbuild с нужными параметрами и ключом /bl (запись бинарного лога)
И дальше всё как на ладони
— какие выполнялись targets (а какие из-за условий пропускались — т.е. вы все равно видите полный pipeline)
— какие параметры передавались в tasks
— какие на выходе этими задачами менялись коллекции items или properties
— ...

+ Поиск по всему
+ Переход к исходному коду

В общем даже отладчик (он был раньше — можно было подключиться к MSBuild 4.0 и прямо из студии по MSBuild файлу ставить точки останова и смотреть что и как менялось в runtime!) не нужен — ну только сами tasks отлаживать.

S>Выглядит крайне коряво, увы.

Да я бы не сказал, если честно. Pre- и PostBuild targets используются регулярно.
Но если это OpenSource проект и дело не сильно горит, я могу попробовать на досуге глянуть. Вдруг найду более красивое решение (хотя передача результатов между проектами не сильно мне знакомая тема. Я обычно или правил существующие стандартные проекты — инъекции в процесс сборки, или выяснить какие параметры есть, ... — ну или писал свои отдельные MSBuild для, например, сборки всего солюшена с какой-то постобработкой.)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.