gpt4 book ai didi

visual-studio - 我如何通知依赖项目在使用 ProjectReference 时必须将输出复制到本地?

转载 作者:行者123 更新时间:2023-12-04 06:27:08 27 4
gpt4 key购买 nike

我有两个项目,我们称它们为项目 A 和项目 B。

项目 A 有一个 CopyToOutputDirectory 内容项,如下:

<ItemGroup>
<Content Include="MyExampleDependency.txt">
<Link>MyFunOutputLocation\MyExampleDependency.txt</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>

项目 B 引用项目 A:
<ItemGroup>
<ProjectReference Include="..\..\Shared\Project A.csproj">
<Project>{My GUID here</Project>
<Name>Project A</Name>
</ProjectReference>
</ItemGroup>

当我构建项目 B 时,将项目 A 生成的 .dll 以及此文本文件复制到输出中是足够聪明的。也就是说,当我构建项目 B 时,我最终会得到这样的结果:
  • bin\Project A\Project A.dll
  • bin\Project A\MyFunOutputLocation\MyExampleDependency.txt
  • bin\Project B\Project A.dll
  • bin\Project B\Project B.exe
  • bin\Project B\MyFunOutputLocation\MyExampleDependency.txt

  • 我想在项目 A 中开始生成一个新的依赖项;例如来自 T4 变换。这可能是我用 <Exec 生成的文件任务,或由某个自定义目标生成的文件,或类似的。例如:
    <ItemGroup>
    <Content Include="Foo.tt">
    <Generator>TextTemplatingFileGenerator</Generator>
    <OutputFilePath>$(OutDir)</OutputFilePath>
    <LastGenOutput>Foo.xml</LastGenOutput>
    </Content>
    </ItemGroup>

    现在,当我构建时,我最终会得到这样的结果:
  • bin\Project A\Project A.dll
  • bin\Project A\Foo.xml <-- 未复制到项目 B!
  • bin\Project A\MyFunOutputLocation\MyExampleDependency.txt
  • bin\Project B\Project A.dll
  • bin\Project B\Project B.exe
  • bin\Project B\MyFunOutputLocation\MyExampleDependency.txt

  • 注意 Project A.dll 所需的生成文件当 dll 被复制到项目 B 中时,to work 不会与该 dll 一起复制。我如何通知项目 B 它需要从项目 A 复制此文件(不编辑项目 B 的 .csproj 文件)?

    最佳答案

    如果只是设计时 Foo.tt输出然后就像在解决方案资源管理器中扩展它并标记 Foo.txt 一样简单使用适当的复制到输出目录,如果您更改扩展名,请记住再次标记它,因为这将删除并将其读入丢失 CopyToOutputDirectory 的项目组中。元数据。

    如果是外部任务,则需要在项目 A 中 Hook 延迟事件(因此它不会在加载时污染资源管理器,甚至不会在清理时出错)并将其添加到 Content最好使用通配符或存在条件。请记住,您选择的事件需要在自定义任务之后运行,但在 _CopyFilesMarkedCopyLocal 之前运行。 ,例如如果您在 PreBuildEvent 中创建文件项目 A 并钩入 BeforeBuild它不适用于项目 B 上的干净构建,您必须再次将其重建为 BeforeBuild首先运行,在评估时找不到任何东西。

    项目 A.csproj

    <Target Name="BeforeBuild">
    <ItemGroup>
    <Content Include="$(OutputPath)\Bar.txt" Condition="Exists('$(OutputPath)\Bar.txt')">
    <Link>Bar.txt</Link>
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    </ItemGroup>
    </Target>

    编辑 :

    请尝试以下操作。

    Project A定义一个 Foo延迟/按需包含 T4 输出的目标。
    <Target Name="Foo">
    <ItemGroup>
    <Content Include="Foo.xml">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    </ItemGroup>
    </Target>

    你说你在构建时进行转换,所以在项目的某个地方你有 TextTemplating定义 Transform 的导入目标及其依赖项。
    <PropertyGroup>
    <TransformOnBuild>true</TransformOnBuild>
    </PropertyGroup>

    <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v12.0\TextTemplating\Microsoft.TextTemplating.targets" />

    钩入其中之一,即 AfterTransform , 在 .targets 之后进口。
    <PropertyGroup>
    <AfterTransform>$(AfterTransform);Foo</AfterTransform>
    </PropertyGroup>

    这将涵盖 90% 的案例,剩下的 9% 正在 build Project B直接在 Visual Studio 中单独的 Project A . Rebuild感谢 AfterTransform但我们需要钩入 Import因为如你所见 BeforeBuild不会执行,因为没有更改并且 Visual Studio 会缓存所有内容。我们通过 InitialTargets 来做到这一点在 Project A .
    <Project InitialTargets="Foo"

    最后的 1% 是当您删除 .xml 时手动并再次构建以反对重建,但它与删除 .pdb 的行为相同, 缓存的 VS 构建只会在 .dll 时再次复制它本身缺失或不同。

    关于visual-studio - 我如何通知依赖项目在使用 ProjectReference 时必须将输出复制到本地?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25092284/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com