【问题标题】:How to copy and rename file to output folder as part of build作为构建的一部分,如何将文件复制和重命名到输出文件夹
【发布时间】:2020-02-22 00:10:41
【问题描述】:

我相信这更像是一个与 msbuild 相关的问题。 有一个 .net 核心应用程序,我需要有条件地发布一个文件,并根据在 Visual Studio 2019 中选择的构建配置,该文件应该在发布到目标之前重命名。

所以我正在考虑修改 csproj 文件(它只是一个 msbuild 文件本身) 我在复制任务中没有看到条件选项 https://docs.microsoft.com/en-us/visualstudio/msbuild/copy-task?view=vs-2019

我追求的目标是,如果我有 3 个不同的文件
tester-notes.dev.json tester-notes.debug.json tester-notes.prod.json

如果选择 prod 作为构建配置,我希望发布的文件为 tester-notes.prod.json,但重命名为 tester-notes.json

【问题讨论】:

  • 你什么时候得到这三个文件,在构建之前还是之后? (构建会生成那些文件?)

标签: visual-studio .net-core msbuild


【解决方案1】:

假设您在开发时在解决方案资源管理器中有三个文件(构建操作 = 无):

如果您使用FileSystem 发布模式,您可以使用类似于此脚本的内容重命名并复制到发布文件夹:

<ItemGroup Condition="$(Configuration)=='Dev'">
    <FileToRename Include="$(ProjectDir)\tester-notes.dev.json" />
  </ItemGroup>
  <ItemGroup Condition="$(Configuration)=='Debug'">
    <FileToRename Include="$(ProjectDir)\tester-notes.debug.json" />
  </ItemGroup>
  <ItemGroup Condition="$(Configuration)=='Prof'">
    <FileToRename Include="$(ProjectDir)\tester-notes.prof.json" />
  </ItemGroup>

  <Target Name="DoSthAfterPublish1" AfterTargets="Publish" Condition="$(Configuration)=='Dev'">
    <Copy SourceFiles="@(FileToRename)" DestinationFiles="@(FileToRename->Replace('.dev.json','.json'))"/>
    <Move SourceFiles="$(ProjectDir)\tester-notes.json" DestinationFolder="$(PublishDir)" OverwriteReadOnlyFiles="true"/>
  </Target>

  <Target Name="DoSthAfterPublish2" AfterTargets="Publish" Condition="$(Configuration)=='Debug'">
    <Copy SourceFiles="@(FileToRename)" DestinationFiles="@(FileToRename->Replace('.debug.json','.json'))"/>
    <Move SourceFiles="$(ProjectDir)\tester-notes.json" DestinationFolder="$(PublishDir)" OverwriteReadOnlyFiles="true"/>
  </Target>

  <Target Name="DoSthAfterPublish3" AfterTargets="Publish" Condition="$(Configuration)=='Prof'">
    <Copy SourceFiles="@(FileToRename)" DestinationFiles="@(FileToRename->Replace('.prof.json','.json'))"/>
    <Move SourceFiles="$(ProjectDir)\tester-notes.json" DestinationFolder="$(PublishDir)" OverwriteReadOnlyFiles="true"/>
  </Target>

如果您可以将tester-notes.debug.json重置为tester-notes.Debug.json,那么我们可以使用DestinationFiles="@(FileToRename-&gt;Replace('.$(Configuration).json','.json'))"将三个目标合二为一。希望对你有所帮助:)

另外:

根据 Intellisense 我们可以发现Copy task 支持Condition

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
  • 2012-01-09
相关资源
最近更新 更多