Как загрузить вывод сгенерированных файлов с помощью msbuild - PullRequest
0 голосов
/ 04 мая 2018

У меня есть файл .csproj, в котором я объявляю некоторые сгенерированные файлы:

<ItemGroup>
    <AutoGenerated Include="generated\*.cs;generated\Models\*.cs"/>
</ItemGroup>

Используется как Outputs для задачи:

<Target Name="GenerateFilesFromTemplate" BeforeTargets="BeforeBuild;BeforeRebuild"
        Inputs="sometemplatefile"
        Outputs="@(AutoGenerated)">
    <Exec
        Command="somegenerator.exe ... "
        Outputs="@(AutoGenerated)"/>
</Target>

В generated/ добавлен .gitignore, поэтому сгенерированные файлы не являются частью системы контроля версий.

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

GenerateFilesFromTemplate:
Skipping target "GenerateFilesFromTemplate" because it has no outputs.

Я чувствую, что делаю это неправильно или я упускаю очевидное. Я знаю, что могу удалить Inputs и Outputs на Task, и тогда он будет генерировать файлы при каждой сборке. Но генерация длится долго, и я хочу избежать этого, если в этом нет необходимости (файл шаблона не изменился). Как сделать самозагрузку сборки и сгенерировать файлы при первой сборке или при необходимости?

1 Ответ

0 голосов
/ 04 мая 2018

Элементы вывода предназначены для указания известных выходных файлов цели. Затем MSBuild проверяет, все ли даты модификации выходных данных превышают наивысшую дату изменения входных элементов, чтобы определить, можно ли пропустить цель. Он также запустит цель, если один из выходов отсутствует.

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

например. write используйте задачу WriteLinesToFile (сконфигурированную для перезаписи), чтобы обновить файл ($(IntermediateOutputPath)autogen.marker) и используйте файл в качестве выходного элемента. Затем он будет запускать цель при первой сборке, а затем запускаться только в том случае, если входной файл шаблона новее, чем маркер.

...