MSBuild:使用复制任务根据文件名将文件列表复制到不同位置
MSBuild: Copying a list of files into different locations based on file name using the Copy Task
我有一组特定于客户的配置文件,它们在构建时位于单个 Release 文件夹中。文件名类似于:
- CustomerA_InstanceConfigurationX.config
- CustomerA_InstanceConfigurationY.config
- CustomerB_InstanceConfigurationX.config
- CustomerB_InstanceConfigurationY.config
...等等
在构建期间,我想将客户特定的配置文件复制到客户特定的二进制文件文件夹:
- $(构建目录)\Binaries\Installers\CustomerA\ProductName\
- $(构建目录)\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
- CustomerC.
%(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>
这行得通,但我基本上想知道是否可以在 不显式使用客户名称的情况下 做同样的事情,这样我就不必每次都维护这个列表我们添加了一个新客户。
创建文件的目标元数据(我更改了路径以使其更适合 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>
我有一组特定于客户的配置文件,它们在构建时位于单个 Release 文件夹中。文件名类似于:
- CustomerA_InstanceConfigurationX.config
- CustomerA_InstanceConfigurationY.config
- CustomerB_InstanceConfigurationX.config
- CustomerB_InstanceConfigurationY.config
...等等
在构建期间,我想将客户特定的配置文件复制到客户特定的二进制文件文件夹:
- $(构建目录)\Binaries\Installers\CustomerA\ProductName\
- $(构建目录)\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
- CustomerC.
%(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>
这行得通,但我基本上想知道是否可以在 不显式使用客户名称的情况下 做同样的事情,这样我就不必每次都维护这个列表我们添加了一个新客户。
创建文件的目标元数据(我更改了路径以使其更适合 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>