gpt4 book ai didi

visual-studio - 如何使用 MSBuild 在输出目录之间复制文件?

转载 作者:行者123 更新时间:2023-12-05 06:34:31 24 4
gpt4 key购买 nike

我有一个 C# 库,它有一种在构建时生成输出的复杂方法,我无法将正确的输出复制到引用它的项目。

解决方案结构

MySolution
├─ MyConsoleApp (c# console)
│ └─ Program.cs
└─ MyNodeServices (c# library)
├─ node_modules**
├─ NodeProgram
│ ├─ build**
│ │ ├─ tsCode.js**
│ │ └─ tsCode.map**
│ └─ src
│ └─ tsCode.ts (TypeScriptCompile)
├─ package.json
├─ tsconfig.json
└─ CodeThatReferencesNodeProgram.cs

** indicates files are not included in project

在构建时,我希望 MyNodeServicesNodeProgram 文件夹完全复制到输出目录(src 和构建),然后复制 node_modules 进入 NodeProgram。这将是我使用 NodeServices 时的执行上下文。

MyConsoleApp 引用 MyNodeServices 并且我希望将 MyNodeServices 中的 NodeProgram 目录复制到输出目录MyConsoleApp 正在构建中。

约束

  • MyNodeServices 将被多个项目引用,因此我想避免将构建后的副本添加到 MyConsoleApp 和其他引用项目。
  • 我不想在项目的 node_modules 和 NodeProgram/build 中包含单独的文件,因为内容是在构建时生成的。
  • 我不希望 NodeProgram/src 中的每个文件都在解决方案中列出两次。

我尝试过的

将 NodeProgram 作为内容包含在内

<TypeScriptCompile Include="NodeProgram\src\tsCode.ts">
<Content Include="$(ProjectDir)NodeProgram\**" />

这适用于将代码包含在 MyConsoleApp 的输出中,但 .ts 文件在解决方案资源管理器中显示两次。这也不涉及 node_modules。

构建复制后

<Target Name="AfterBuild">
<ItemGroup>
<ProgramCode Include="$(ProjectDir)NodeProgram\**" />
<NodeModules Include="$(ProjectDir)node_modules\**" />
</ItemGroup>
<MakeDir Directories="$(TargetDir)\NodeProgram" Condition=" !Exists('$(TargetDir\NodeProgram') " />
<MakeDir Directories="$(TargetDir)\NodeProgram\node_modules" Condition=" !Exists('$(TargetDir\NodeProgram\node_modules') " />
<Copy SourceFiles="@(ProgramCode)" DestinationFiles="@(ProgramCode->'$(TargetDir)\NodeProgram\%(RecursiveDir)%(Filename)%(Extension)')" SkipUnchangedFiles="true" />
<Copy SourceFiles="@(NodeModules)" DestinationFiles="@(NodeModules->'$(TargetDir)\NodeProgram\node_modules\%(RecursiveDir)%(Filename)%(Extension)')" SkipUnchangedFiles="true" />
</Target>

这使我的解决方案保持干净并将正确的文件复制到输出目录,但之后这些文件似乎被忽略了。如果我清理解决方案,复制的文件夹将保留在输出目录中,并且内容不会复制到引用项目。

问题

  • 有没有办法指定输出目录中的哪些文件是重要的?
  • 对此有更好的方法吗?

最佳答案

我想出了一个似乎可以解决我的问题的解决方案。我已将以下内容添加到 MyNodeServices

的项目文件中
<!-- Specify the files to be included in the output directory -->
<ItemGroup>
<NodeFile Include="NodePrograms\**">
<InProject>false</InProject>
</NodeFile>

<NodeModule Include="node_modules\**">
<InProject>false</InProject>
</NodeModule>
</ItemGroup>


<!-- Copy files from the project directory into the output directory -->
<Target Name="BeforeBuild"
Inputs="@(NodeFile);@(NodeModules)"
Outputs="@(NodeFile->'$(OutputPath)%(RelativeDir)%(Filename)%(Extension)');@(NodeModule->'$(OutputPath)NodePrograms\%(RelativeDir)%(Filename)%(Extension)')">

<Copy SourceFiles="@(NodeFile)"
DestinationFiles="$(OutputPath)%(NodeFile.RelativeDir)%(NodeFile.Filename)%(NodeFile.Extension)" />

<Copy SourceFiles="@(NodeModule)"
DestinationFiles="$(OutputPath)NodePrograms\%(NodeModule.RelativeDir)%(NodeModule.Filename)%(NodeModule.Extension)" />

<ItemGroup>
<!-- Specify files that were written to the output directory so the clean task knows to remove them -->
<FileWrites Include="@(NodeFile->'$(OutputPath)%(RelativeDir)%(Filename)%(Extension)')"/>
<FileWrites Include="@(NodeModule->'$(OutputPath)NodePrograms\%(RelativeDir)%(Filename)%(Extension)')"/>
</ItemGroup>

</Target>


<!-- Include the files from the output directory when other projects reference this -->
<Target Name="IncludeNodeFiles"
BeforeTargets="GetCopyToOutputDirectoryItems">

<ItemGroup>
<OutputNodeFiles Include="@(NodeFile->'$(OutputPath)%(RelativeDir)%(Filename)%(Extension)')">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<TargetPath>%(RelativeDir)%(FileName)%(Extension)</TargetPath>
</OutputNodeFiles>

<OutputNodeModules Include="@(NodeModule->'$(OutputPath)NodePrograms\%(RelativeDir)%(Filename)%(Extension)')">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<TargetPath>NodePrograms\%(RelativeDir)%(FileName)%(Extension)</TargetPath>
</OutputNodeModules>

<AllItemsFullPathWithTargetPath Include="@(OutputNodeFiles->'%(FullPath)')" />
<AllItemsFullPathWithTargetPath Include="@(OutputNodeModules->'%(FullPath)')" />
</ItemGroup>
</Target>

关于visual-studio - 如何使用 MSBuild 在输出目录之间复制文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50237472/

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