将一个 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>