如何在构建过程中使用 msbuild 生成文件
How to generate files during build using msbuild
有谁知道如何修改 csproj 文件以在构建期间生成代码文件而不实际引用文件?
像这样的过程:
- 创建文件,
- 在构建期间动态引用临时文件
- 编译后的程序集有额外的成员,具体取决于构建期间创建的文件
这样做的目的是创建一种使用 roslyn 生成代码文件的方法,而不是使用 t4 模板,一旦您尝试根据属性执行某些操作,使用起来会非常尴尬。
因此,我计划提供一种使用特殊 csharp 文件(用于完整语法支持)的方法,以根据该特殊文件的内容以编程方式生成文件。
我花了几周时间在互联网上查找资源(主题为 msbuild),但直到现在我似乎没有使用正确的关键字。
这对我来说是最有见地的:
https://www.simple-talk.com/dotnet/.net-tools/extending-msbuild/
我的猜测是,为了我的目的,正确的构建目标应该是 "BeforeCompile",以便以某种方式使用自定义代码文件填充构建过程。
是否有人对我的问题有经验,或者知道处理该任务的任何特定资源?
我使用的解决方案:
<UsingTask TaskName="DynamicCodeGenerator.DynamicFileGeneratorTask" AssemblyFile="..\DynamicCodeGenerator\bin\Debug\DynamicCodeGenerator.dll" />
<Target Name="DynamicCodeGeneratorTarget" BeforeTargets="BeforeBuild;BeforeRebuild">
<DynamicFileGeneratorTask>
<Output ItemName="Generated" TaskParameter="GeneratedFilePaths" />
</DynamicFileGeneratorTask>
<ItemGroup>
<Compile Include="@(Generated)" />
<FileWrites Include="@(Generated)" />
<!-- For clean to work properly -->
</ItemGroup>
</Target>
不幸的是,我没有按照建议使用属性组覆盖
更新:这个link也很有趣:https://github.com/firstfloorsoftware/xcc/blob/master/FirstFloor.Xcc/Targets/Xcc.targets
生成代码文件可以通过msbuild task or msbuild inline task实现。生成正确的代码取决于您。您必须注意的一件事是创建输出项参数,以便将其附加到 @(Compile) 项。您可以使用 $(IntDir) 位置来定位您新生成的文件,并将它们添加到 @(FileWrites) 项目组中,以便 Clean 目标正常工作。
当你写完你的任务后,你必须像这样在你的项目中使用它:
<UsingTask TaskName="TaskTypeFullName" AssemblyFile="YourAssembly.dll"/>
<PropertyGroup>
<!-- Here you need to experiment with [Build/Compile/SomeOther]DependsOn property -->
<BuildDependsOn>
MyCodeGenerator;
$(BuildDependsOn)
</BuildDependsOn>
</PropertyGroup>
<Target Name="MyCodeGenerator">
<YourTaskName>
<Output ItemName="Generated" TaskParameter="GeneratedFiles" />
</YourTaskName>
<ItemGroup>
<Compile Include="@(Generated)" />
<FileWrites Include="@(Generated)" /> <!-- For clean to work properly -->
</ItemGroup>
</Target>
我想使用 bash 脚本为 Linux 上使用 dotnet 核心的项目生成代码。这对我有用。感谢@stukselbax,我根据你的回答构建了这个。
<Target Name="GenerateProtocolBuffers" BeforeTargets="BeforeBuild;BeforeRebuild">
<Exec Command="./generatecode.sh" Outputs="proto/*.cs">
<Output ItemName="Generated" TaskParameter="Outputs" />
</Exec>
<ItemGroup>
<Compile Include="@(Generated)" />
<FileWrites Include="@(Generated)" />
</ItemGroup>
</Target>
请注意,我用来生成代码的脚本名为 generatecode.sh。将其替换为您自己的。
有谁知道如何修改 csproj 文件以在构建期间生成代码文件而不实际引用文件?
像这样的过程:
- 创建文件,
- 在构建期间动态引用临时文件
- 编译后的程序集有额外的成员,具体取决于构建期间创建的文件
这样做的目的是创建一种使用 roslyn 生成代码文件的方法,而不是使用 t4 模板,一旦您尝试根据属性执行某些操作,使用起来会非常尴尬。
因此,我计划提供一种使用特殊 csharp 文件(用于完整语法支持)的方法,以根据该特殊文件的内容以编程方式生成文件。
我花了几周时间在互联网上查找资源(主题为 msbuild),但直到现在我似乎没有使用正确的关键字。
这对我来说是最有见地的: https://www.simple-talk.com/dotnet/.net-tools/extending-msbuild/
我的猜测是,为了我的目的,正确的构建目标应该是 "BeforeCompile",以便以某种方式使用自定义代码文件填充构建过程。
是否有人对我的问题有经验,或者知道处理该任务的任何特定资源?
我使用的解决方案:
<UsingTask TaskName="DynamicCodeGenerator.DynamicFileGeneratorTask" AssemblyFile="..\DynamicCodeGenerator\bin\Debug\DynamicCodeGenerator.dll" />
<Target Name="DynamicCodeGeneratorTarget" BeforeTargets="BeforeBuild;BeforeRebuild">
<DynamicFileGeneratorTask>
<Output ItemName="Generated" TaskParameter="GeneratedFilePaths" />
</DynamicFileGeneratorTask>
<ItemGroup>
<Compile Include="@(Generated)" />
<FileWrites Include="@(Generated)" />
<!-- For clean to work properly -->
</ItemGroup>
</Target>
不幸的是,我没有按照建议使用属性组覆盖
更新:这个link也很有趣:https://github.com/firstfloorsoftware/xcc/blob/master/FirstFloor.Xcc/Targets/Xcc.targets
生成代码文件可以通过msbuild task or msbuild inline task实现。生成正确的代码取决于您。您必须注意的一件事是创建输出项参数,以便将其附加到 @(Compile) 项。您可以使用 $(IntDir) 位置来定位您新生成的文件,并将它们添加到 @(FileWrites) 项目组中,以便 Clean 目标正常工作。
当你写完你的任务后,你必须像这样在你的项目中使用它:
<UsingTask TaskName="TaskTypeFullName" AssemblyFile="YourAssembly.dll"/>
<PropertyGroup>
<!-- Here you need to experiment with [Build/Compile/SomeOther]DependsOn property -->
<BuildDependsOn>
MyCodeGenerator;
$(BuildDependsOn)
</BuildDependsOn>
</PropertyGroup>
<Target Name="MyCodeGenerator">
<YourTaskName>
<Output ItemName="Generated" TaskParameter="GeneratedFiles" />
</YourTaskName>
<ItemGroup>
<Compile Include="@(Generated)" />
<FileWrites Include="@(Generated)" /> <!-- For clean to work properly -->
</ItemGroup>
</Target>
我想使用 bash 脚本为 Linux 上使用 dotnet 核心的项目生成代码。这对我有用。感谢@stukselbax,我根据你的回答构建了这个。
<Target Name="GenerateProtocolBuffers" BeforeTargets="BeforeBuild;BeforeRebuild">
<Exec Command="./generatecode.sh" Outputs="proto/*.cs">
<Output ItemName="Generated" TaskParameter="Outputs" />
</Exec>
<ItemGroup>
<Compile Include="@(Generated)" />
<FileWrites Include="@(Generated)" />
</ItemGroup>
</Target>
请注意,我用来生成代码的脚本名为 generatecode.sh。将其替换为您自己的。