Я по натуре парень (1).То, что я хочу сделать, является эквивалентом этого фрагмента make:
FILES = generated.cs
app.exe : $(FILES)
csc -out:$@ $(FILES)
generated.cs :
echo "// generated file" > $@
То есть $(FILES)
содержит список файлов, некоторые из которых могут быть сгенерированы другими целями в Makefile.Это просто работает.
Я хотел бы сделать то же самое с MSBuild.К сожалению, моя попытка не удалась:
<Target Name="BuildGenerated"
Outputs="Generated.cs"
>
<WriteLinesToFile
File="Generated.cs"
Lines="// generated file"
Overwrite="True"
/>
</Target>
<ItemGroup>
<Compile Include="Generated.cs" />
</ItemGroup>
То есть используйте <Compile/>
, чтобы включить сгенерированный файл, и MSBuild делает вывод, что, поскольку Generated.cs
не существует, он должен найти <Target/>
сгенерирует этот файл, а затем выполнит его.
Похоже, что единственный способ сделать что-то вроде этого - добавить шаги перед сборкой, но это похоже на хак.Являются ли этапы предварительной сборки единственным способом сделать это?Или есть какой-то способ заставить MSBuild действовать так, как будто у него есть мозг?
Обновление 1 : для справки, это было бы заклинание перед сборкой, необходимое для его работы, и (снова) это то, чего я бы предпочел избежать, если это возможно:
<PropertyGroup>
<CompileDependsOn>
BuildGenerated;$(CompileDependsOn)
</CompileDependsOn>
</PropertyGroup>
Это должно произойти после элемента <Import Project="..." />
, определяющего <CompileDependsOn/>
.