Last active
July 26, 2024 19:34
-
-
Save KirillOsenkov/f20cb84d37a89b01db63f8aafe03f19b to your computer and use it in GitHub Desktop.
Sample of generating a .cs file during build and adding it to the compilation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<Project Sdk="Microsoft.NET.Sdk"> | |
<PropertyGroup> | |
<OutputType>Exe</OutputType> | |
<TargetFramework>net472</TargetFramework> | |
</PropertyGroup> | |
<PropertyGroup> | |
<GeneratedText><![CDATA[ | |
using System%3B | |
public class Hello$(TargetFramework) | |
{ | |
public void Print() | |
{ | |
Console.WriteLine("Hello $(TargetFramework)!")%3B | |
} | |
} | |
]]></GeneratedText> | |
</PropertyGroup> | |
<Target Name="AddGeneratedFile" BeforeTargets="BeforeCompile;CoreCompile" Inputs="$(MSBuildAllProjects)" Outputs="$(IntermediateOutputPath)GeneratedFile.cs"> | |
<PropertyGroup> | |
<GeneratedFilePath>$(IntermediateOutputPath)GeneratedFile.cs</GeneratedFilePath> | |
</PropertyGroup> | |
<ItemGroup> | |
<Compile Include="$(GeneratedFilePath)" /> | |
<FileWrites Include="$(GeneratedFilePath)" /> | |
</ItemGroup> | |
<WriteLinesToFile Lines="$(GeneratedText)" File="$(GeneratedFilePath)" WriteOnlyWhenDifferent="true" Overwrite="true" /> | |
</Target> | |
</Project> |
Rebuild
does Clean;Build
. I think in that case, because the generated file isn't added to @(FileWrites)
, it's not getting deleted/cleaned up on Clean
, so Rebuild
doesn't reset its state.
Incremental build for targets is unconfigurable: it's always on.
A log at detailed
or diagnostic
level should show the target being skipped as up to date.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@rainersigwald,
Would this explain why the following generates
GeneratedFile.cs
the first time, but never regenerates it, even after aRebuild
?Does
Rebuild
force the up-to-date check to return false, but MSBuild decides the target still doesn't need to execute becauseGeneratedFile.cs
was updated more recently than$(MSBuildAllProjects)
?