【问题标题】:MSBuild: Copying a list of files into different locations based on file name using the Copy TaskMSBuild:使用复制任务根据文件名将文件列表复制到不同的位置
【发布时间】:2016-03-09 21:11:09
【问题描述】:

我有一组特定于客户的配置文件,它们在构建时位于单个 Release 文件夹中。文件名类似于:

  • CustomerA_InstanceConfigurationX.config
  • CustomerA_InstanceConfigurationY.config
  • CustomerB_InstanceConfigurationX.config
  • CustomerB_InstanceConfigurationY.config

...等等

在构建期间,我想将客户特定的配置文件复制到客户特定的二进制文件夹

  • $(BuildDirectory)\Binaries\Installers\CustomerA\ProductName\
  • $(BuildDirectory)\Binaries\Installers\CustomerB\ProductName\

所以 CustomerA_InstanceConfigurationX.config 和 CustomerA_InstanceConfigurationY.config 将进入 $(BuildDirectory)\Binaries\Installers\CustomerA\ProductName\ 等等。

如何设置 SourceFiles 和 DestinationFolder 属性来实现这一点?

我将 Customers 列表作为 Instance 属性的元数据,并在其周围设置 SourceFiles 和 DestinationFiles:

<ItemGroup>
  <ConfigFilesToCopy Include="$(BuildDirectory)\stage\InstallerDev\%(Instance.Customer)\Setup\bin\Release\%(Instance.Customer)_*.*" />
  <DestionationsForConfigFiles Include="$(BuildDirectory)\Binaries\Installers\%(Instance.Customer)\InstallerDev\" />
</ItemGroup>

<Copy SourceFiles="@(ConfigFilesToCopy)" DestinationFolder="%(DestionationsForConfigFiles.FullPath)" />

这只是将所有客户.config文件复制到所有客户特定的二进制文件夹中。

使用消息任务,%(Instance.Customer) 输出:

  • 客户A
  • 客户B
  • 客户C.

%(ConfigFilesToCopy.Identity) 输出:

  • “C:\Builds\AgentX\YYY\INSTALLER_DEV Build\stage\InstallerDev\CustomerA\Setup\bin\Release\CustomerA_InstanceX.config”
  • “C:\Builds\AgentX\YYY\INSTALLER_DEV Build\stage\InstallerDev\CustomerA\Setup\bin\Release\CustomerA_InstanceY.config”
  • “C:\Builds\AgentX\YYY\INSTALLER_DEV Build\stage\InstallerDev\CustomerB\Setup\bin\Release\CustomerB_InstanceX.config”
  • “C:\Builds\AgentX\YYY\INSTALLER_DEV Build\stage\InstallerDev\CustomerB\Setup\bin\Release\CustomerB_InstanceY.config”

%(DestionationsForConfigFiles.Identity) 输出:

  • C:\Builds\Agent8\Five0\INSTALLER_DEV Build\Binaries\Installers\CustomerA\InstallerDev\
  • C:\Builds\Agent8\Five0\INSTALLER_DEV Build\Binaries\Installers\CustomerB\InstallerDev\
  • C:\Builds\Agent8\Five0\INSTALLER_DEV Build\Binaries\Installers\CustomerC\InstallerDev\

如果有人可以为实现这一目标提供一些帮助或有替代方法,那就太好了。 (例如,我可以将客户特定的配置文件重新组织到客户特定的文件夹或其他东西中。)提前非常感谢!

[** 更新说明 **:目前,我将每个客户名称硬编码到 ConfigFilesToCopy 列表项和 DestinationsForConfigFiles 项中。

  <ConfigFilesToCopy Include="$(BuildDirectory)\stage\InstallerDev\CustomerA\Setup\bin\Release\CustomerA_*.*">
    <DestionationsForConfigFiles>$(BuildDirectory)\Binaries\Installers\CustomerA\InstallerDev\</DestionationsForConfigFiles>
  </ConfigFilesToCopy>

  <ConfigFilesToCopy Include="$(BuildDirectory)\stage\InstallerDev\CustomerB\Setup\bin\Release\CustomerB_*.*">
    <DestionationsForConfigFiles>$(BuildDirectory)\Binaries\Installers\CustomerB\InstallerDev\</DestionationsForConfigFiles>
  </ConfigFilesToCopy>

这行得通,但我基本上想知道是否可以明确使用客户名称来做同样的事情,这样我就不必每次添加新客户时都维护这个列表.

【问题讨论】:

    标签: visual-studio build msbuild msbuild-task


    【解决方案1】:

    制作文件的目标元数据(我更改了路径,使其更适合 SO 的代码框,但想法是一样的):

    <Target Name="Copy">
      <ItemGroup>
        <ConfigFilesToCopy Include="$(SomeDir)\%(Instance.Customer)\%(Instance.Customer)_*.*">
          <DestionationsForConfigFiles>$(SomeDir)\Binaries\%(Instance.Customer)</DestionationsForConfigFiles>
        </ConfigFilesToCopy>
      </ItemGroup>
    
      <Message Text="Source=%(ConfigFilesToCopy.Identity) Dest=%(ConfigFilesToCopy.DestionationsForConfigFiles)" />
    </Target>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-30
      • 1970-01-01
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      相关资源
      最近更新 更多