Skip to content

Instantly share code, notes, and snippets.

@george-polevoy
Created September 9, 2022 16:41
Show Gist options
  • Save george-polevoy/7e18a8ea6b070251c7909f8cbb41e506 to your computer and use it in GitHub Desktop.
Save george-polevoy/7e18a8ea6b070251c7909f8cbb41e506 to your computer and use it in GitHub Desktop.
<Project InitialTargets="EmbedFileAsStringResources">
<Target Name="EmbedFileAsStringResources"
BeforeTargets="Build">
<ItemGroup>
<EmbeddedResource Include="@(FileAsStringResource)">
<LogicalName>%(Identity)</LogicalName>
<ManifestResourceName>%(Identity)</ManifestResourceName>
</EmbeddedResource>
</ItemGroup>
</Target>
<Target Name="BuildResourceAccessorGeneratorTool">
<!-- use Properties="_NeverMind=Me" according this issue https://github.com/Microsoft/msbuild/issues/2455#issuecomment-323575719 -->
<MSBuild Projects="$(MSBuildThisFileDirectory)ResourceAccessGenerator.csproj"
Targets="Restore"
Properties="_NeverMind=Me;TargetFramework=net6.0"
/>
<MSBuild Projects="$(MSBuildThisFileDirectory)ResourceAccessGenerator.csproj"
Targets="Build"
Properties="Configuration=Release; TargetFramework=net6.0">
<Output TaskParameter="TargetOutputs"
PropertyName="ResourceAccessorGeneratorTool"/>
</MSBuild>
</Target>
<!--
Inputs/Outputs used to execute target for each FileAsStringResource independently,
but incremental build ignores added/removed files after VCS checkout and does not regenerate resource accessors,
so Outputs refers to files that will never exist
-->
<Target Name="GenerateResourceAccessors"
DependsOnTargets="BuildResourceAccessorGeneratorTool"
BeforeTargets="DispatchToInnerBuilds;BeforeBuild"
Inputs="@(FileAsStringResource)"
Outputs="%(ClassName).NonExistingFile">
<PropertyGroup>
<GeneratedResourceAccessorDirectory>Generated</GeneratedResourceAccessorDirectory>
<GeneratedResourceAccessorFileName>$([System.IO.Path]::Combine($(GeneratedResourceAccessorDirectory),%(FileAsStringResource.ClassName).cs))</GeneratedResourceAccessorFileName>
<GeneratorResourceSpec>@(FileAsStringResource->'%(Identity)|%(ClassName)|%(Filename)', '||')</GeneratorResourceSpec>
<GeneratorAnnotations>%(FileAsStringResource.Annotations)</GeneratorAnnotations>
</PropertyGroup>
<!-- run target once in multi-targeting build - see https://github.com/Microsoft/msbuild/issues/2781#issuecomment-350118208 -->
<MSBuild Projects="$(MSBuildProjectFile)"
Targets="ExecuteResourceAccessorGeneratorTool"
Properties="TargetFramework=once;GeneratedResourceAccessorDirectory=$(GeneratedResourceAccessorDirectory);GeneratedResourceAccessorFileName=$(GeneratedResourceAccessorFileName);ResourceAccessorGeneratorTool=$(ResourceAccessorGeneratorTool);GeneratorResourceSpec=$(GeneratorResourceSpec);GeneratorAnnotations=$(GeneratorAnnotations)"/>
<ItemGroup>
<Compile Remove="$(GeneratedResourceAccessorFileName)"/>
<Compile Include="$(GeneratedResourceAccessorFileName)"/>
</ItemGroup>
</Target>
<Target Name="ExecuteResourceAccessorGeneratorTool">
<MakeDir Directories="$(GeneratedResourceAccessorDirectory)"/>
<Exec Command="dotnet &quot;$(ResourceAccessorGeneratorTool)&quot; &quot;ResourceSpec=$(GeneratorResourceSpec)&quot; &quot;Annotations=$(GeneratorAnnotations)&quot; &gt; &quot;$(GeneratedResourceAccessorFileName)&quot;"
ConsoleToMSBuild="true"/>
</Target>
</Project>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment