将一个 CSPROJ 中自定义目标的输出复制到另一个 CSPROJ
Copy output of custom target in one CSPROJ into another CSPROJ
所以我正在用 C#/.NET 为自己开发一个游戏引擎框架,我一直在努力简化构建着色器文件(渲染引擎使用 SPIR-V 文件,我想从 GLSL 源代码生成) .
我目前的方法是使用导入到 CSPROJ 中的自定义 .targets 文件,该文件定义了一个自定义目标,如下所示:
<Target
Name="Vert"
AfterTargets="Build">
<MakeDir Directories="$(OutputPath)%(VertShader.RelativeDir)"/>
<Exec Command='"$(ENGINE_ROOT)\tools\glslang\windows-x64\glslangValidator.exe" -V %(VertShader.Identity) %(VertShader.OptLevel) -o $(OutputPath)%(VertShader.Identity).spv'></Exec>
</Target>
这背后的总体思路是获取 VertShader 项目,通过 glslang 运行 .vert 文件,并将输出 .vert.spv 文件输出到构建输出目录中。
这很好用,几乎。
问题是,如果我的项目 A 有一堆着色器,然后项目 B 引用了项目 A,我想复制项目 A 生成的 .vert.spv 着色器项目 B 的构建输出目录,但我没有太多运气来争论目标语法来做我想做的事。
有什么方法可以让我按照我描述的方式工作吗?
我不确定我是否正确理解了你的问题,但如果你想将你的 .vert.spv 复制到另一个文件夹,请使用 File.Copy()
好吧,我想我确实设法自己弄明白了,添加一个答案以防对其他人有帮助。
将此添加到我的 .targets 文件似乎允许将它们复制到任何依赖项目。我 相信 这基本上是用 MSBuild 复制到当前构建输出目录的文件列表注册我正在创建的所有文件(这会导致它们被复制到任何项目引用了这个)
<Target
Name="IncludeVert"
BeforeTargets="GetCopyToOutputDirectoryItems">
<ItemGroup>
<CompiledVerts Include="@(VertShader -> '$(OutputPath)%(RelativeDir)%(Filename).vert.spv' )">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<TargetPath>%(RelativeDir)%(Filename).vert.spv</TargetPath>
</CompiledVerts>
<AllItemsFullPathWithTargetPath Include="@(CompiledVerts->'%(FullPath)')" />
</ItemGroup>
</Target>
所以我正在用 C#/.NET 为自己开发一个游戏引擎框架,我一直在努力简化构建着色器文件(渲染引擎使用 SPIR-V 文件,我想从 GLSL 源代码生成) . 我目前的方法是使用导入到 CSPROJ 中的自定义 .targets 文件,该文件定义了一个自定义目标,如下所示:
<Target
Name="Vert"
AfterTargets="Build">
<MakeDir Directories="$(OutputPath)%(VertShader.RelativeDir)"/>
<Exec Command='"$(ENGINE_ROOT)\tools\glslang\windows-x64\glslangValidator.exe" -V %(VertShader.Identity) %(VertShader.OptLevel) -o $(OutputPath)%(VertShader.Identity).spv'></Exec>
</Target>
这背后的总体思路是获取 VertShader 项目,通过 glslang 运行 .vert 文件,并将输出 .vert.spv 文件输出到构建输出目录中。 这很好用,几乎。
问题是,如果我的项目 A 有一堆着色器,然后项目 B 引用了项目 A,我想复制项目 A 生成的 .vert.spv 着色器项目 B 的构建输出目录,但我没有太多运气来争论目标语法来做我想做的事。
有什么方法可以让我按照我描述的方式工作吗?
我不确定我是否正确理解了你的问题,但如果你想将你的 .vert.spv 复制到另一个文件夹,请使用 File.Copy()
好吧,我想我确实设法自己弄明白了,添加一个答案以防对其他人有帮助。 将此添加到我的 .targets 文件似乎允许将它们复制到任何依赖项目。我 相信 这基本上是用 MSBuild 复制到当前构建输出目录的文件列表注册我正在创建的所有文件(这会导致它们被复制到任何项目引用了这个)
<Target
Name="IncludeVert"
BeforeTargets="GetCopyToOutputDirectoryItems">
<ItemGroup>
<CompiledVerts Include="@(VertShader -> '$(OutputPath)%(RelativeDir)%(Filename).vert.spv' )">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<TargetPath>%(RelativeDir)%(Filename).vert.spv</TargetPath>
</CompiledVerts>
<AllItemsFullPathWithTargetPath Include="@(CompiledVerts->'%(FullPath)')" />
</ItemGroup>
</Target>