通过 MsBuildProj 文件转换多个项目的多个配置文件

2024-02-22

我正在尝试根据模式(所有形式的文件)在文件列表上运行多个命令*.config在给定目录的子目录下),如下所示:

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="BuildSolution" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <UsingTask TaskName="TransformXml"
      AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v12.0\Web\Microsoft.Web.Publishing.Tasks.dll" />

  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <TransformConfiguration>Release</TransformConfiguration>
    <PublishFolder>$(OutDir)_PublishedWebsites</PublishFolder>
  </PropertyGroup>

  <Target Name="BuildSolution">
    <MSBuild Projects="$(MSBuildProjectDirectory)\SolutionName.sln"
      ContinueOnError="false"
      Properties="PublishProfile=$(TransformConfiguration);DeployOnBuild=true" />
  </Target>

  <ItemGroup>
    <ConfigFiles Include="$(PublishFolder)\**\*.config" />
  </ItemGroup>

  <Target Name="TransformWebConfig" AfterTargets="BuildSolution" 
            Condition="'@(ConfigFiles)'!=''"
            Outputs="%(ConfigFiles.Identity)">

    <PropertyGroup>
      <ConfigFile>%(ConfigFiles.Identity)</ConfigFile>
      <BackupFile>$([System.IO.Path]::ChangeExtension($(ConfigFile),&quot;.Source.config&quot;))</BackupFile>
      <TransformFile>$([System.IO.Path]::ChangeExtension($(ConfigFile),$(TransformConfiguration) + &quot;.Source.config&quot;))</TransformFile>
    </PropertyGroup>

    <Message Text="$(ConfigFile)" />
    <Message Text="$(BackupFile)" />
    <Message Text="$(TransformFile)" />

    <Copy SourceFiles="$(ConfigFile)"
          DestinationFiles="$(BackupFile)" />

    <Exec Command="attrib -r $(ConfigFile)" />

    <TransformXml Source="$(BackupFile)"
                  Transform="$(TransformFile)"
                  Destination="$(ConfigFile)"
                  StackTrace="false" />

  </Target>

</Project>

但是,不执行匹配文件的批处理。

  • 从我添加的输出中我看到该属性$(PublishFolder)指向正确的目录,但是该项目@(ConfigFiles)留空。

我还尝试手动列出目录名称和配置文件名称,如下所示:

  <ItemGroup>
    <Sites Include="Site1" />
    <Sites Include="Site2" />
  </ItemGroup>
  <ItemGroup>
    <ConfigFiles Include="Web" />
    <ConfigFiles Include="NLog" />
  </ItemGroup>

  <Target Name="TransformWebConfig" AfterTargets="BuildSolution">

    <PropertyGroup>
      <SiteConfigFile>$(PublishFolder)\%(Sites.Identity)\%(ConfigFiles.Identity)</SiteConfigFile>
    </PropertyGroup>

    <Message Text="$(SiteConfigFile)" />

    <Copy SourceFiles="$(SiteConfigFile).config"
          DestinationFiles="$(SiteConfigFile).Source.config"/>

    <Exec Command="attrib -r $(SiteConfigFile).config" />

    <TransformXml Source="$(SiteConfigFile).Source.config"
                  Transform="$(SiteConfigFile).$(TransformConfiguration).config"
                  Destination="$(SiteConfigFile).config"
                  StackTrace="false" />
  </Target>

然而,在这种情况下,转换仅应用于一个站点中的一个文件。


知道该怎么做才能让它发挥作用吗?


我经历过的类似问题和MSDN参考资料:

MSBUild:复制文件,其名称基于原始文件(遵循模式) https://stackoverflow.com/questions/5377917/msbuild-copy-files-with-a-name-based-on-the-original-following-a-pattern

MSBuild 多个输出路径 https://stackoverflow.com/questions/17412256/msbuild-multiple-outputpath

如何从 msbuild 项目文件本身中使用不同的参数调用相同的 msbuild 目标两次 https://stackoverflow.com/questions/1294147/how-to-invoke-the-same-msbuild-target-twice-with-different-parameters-from-withi

msbuild 数组迭代 https://stackoverflow.com/questions/3045821/msbuild-array-iteration

http://msdn.microsoft.com/en-us/library/ms171454.aspx http://msdn.microsoft.com/en-us/library/ms171454.aspx


Edit:

将 ItemGroup 移动到任务下可以在创建文件后读取文件列表,但是现在仅转换列表中的第一个文件:

<ItemGroup>
  <ConfigFiles Include="$(PublishFolder)\**\Web.config;$(PublishFolder)\**\NLog.config"
               Exclude="$(PublishFolder)\**\Packages.config;$(PublishFolder)\**\*.*.config;$(PublishFolder)\**\bin\*.config" />
</ItemGroup>

<PropertyGroup>
  <ConfigFile>%(ConfigFiles.Identity)</ConfigFile>
  <BackupFile>$([System.IO.Path]::ChangeExtension($(ConfigFile),&quot;.Source.config&quot;))</BackupFile>
  <TransformFilePrefix>$([System.String]::Concat($(TransformConfiguration), &quot;.config&quot;))</TransformFilePrefix>
  <TransformFile>$([System.IO.Path]::ChangeExtension($(ConfigFile), $(TransformFilePrefix)))</TransformFile>
</PropertyGroup>

<Message Text="$(PublishFolder)" />
<Message Text="@(ConfigFiles)" />
<Message Text="$(ConfigFile)" />
<Message Text="$(BackupFile)" />
<Message Text="$(TransformFile)" />

<Copy SourceFiles="$(ConfigFile)"
      DestinationFiles="$(BackupFile)" />

<Exec Command="attrib -r $(ConfigFile)" />

<TransformXml Source="$(BackupFile)"
              Transform="$(TransformFile)"
              Destination="$(ConfigFile)"
              StackTrace="false" />

找到了解决方案:

创建一个用于创建项目组的目标:

  <Target Name="ListWebConfigs" AfterTargets="BuildSolution">

    <ItemGroup>
      <ConfigFiles Include="$(PublishFolder)\**\Web.config;$(PublishFolder)\**\NLog.config"
                   Exclude="$(PublishFolder)\**\Packages.config;$(PublishFolder)\**\*.*.config;$(PublishFolder)\**\bin\*.config" />
    </ItemGroup>

    <Message Text="$(PublishFolder)" />
    <Message Text="@(ConfigFiles)" />

  </Target>

然后是实际转换的另一个:

  <!-- \x to prevent MSBuild from skipping "because all output files are up-to-date" -->
  <Target Name="TransformWebConfig" AfterTargets="ListWebConfigs" Inputs="@(ConfigFiles)" Outputs="%(ConfigFiles.Identity)\x">

    <PropertyGroup>
      <ConfigFile>%(ConfigFiles.Identity)</ConfigFile>
      <BackupFile>$([System.IO.Path]::ChangeExtension($(ConfigFile),&quot;.Source.config&quot;))</BackupFile>
      <TransformFilePrefix>$([System.String]::Concat($(TransformConfiguration), &quot;.config&quot;))</TransformFilePrefix>
      <TransformFile>$([System.IO.Path]::ChangeExtension($(ConfigFile), $(TransformFilePrefix)))</TransformFile>
    </PropertyGroup>

    <Message Text="$(PublishFolder)" />
    <Message Text="@(ConfigFiles)" />

    <Message Text="$(ConfigFile)" />
    <Message Text="$(BackupFile)" />
    <Message Text="$(TransformFile)" />

    <Copy SourceFiles="$(ConfigFile)" DestinationFiles="$(BackupFile)" />

    <Exec Command="attrib -r $(ConfigFile)" />

    <TransformXml Source="$(BackupFile)"
                  Transform="$(TransformFile)"
                  Destination="$(ConfigFile)"
                  StackTrace="false" />

  </Target>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过 MsBuildProj 文件转换多个项目的多个配置文件 的相关文章

随机推荐

  • Rails:activeadmin 覆盖创建操作

    我有一个 activeadmin 资源 它具有 own to user 关系 当我在活动管理中创建模型的新实例时 我想将当前登录的用户关联为创建该实例的用户 我想这是相当标准的东西 所以 我让它工作 controller do def cr
  • 直接在 PhpStorm 中运行 PHP 脚本

    如何在 PhpStorm 中立即运行当前的 PHP 文件 如何像 PyCharm 一样在 PHPstorm 中执行 PHP 命令 在编辑器中右键单击 选择Run 或按 ctrl shift f10 用于命令行脚本执行 如果您想在网络服务器上
  • WPF ItemsControl:将项目的类型限制为特定类型

    我正在创建一个 WPF 自定义控件来作为练习 以在 VS 面板中显示日志消息 错误 警告 消息 该控件是一个 ItemControl 每个项目都是一条要显示的消息 但我必须将消息分类到正确的类别中 因此我需要每个项目公开一些内容 可能是一个
  • 在编写 WinAPI 应用程序时是否应该使用匈牙利表示法? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我最近开始学习 Win32 API 我讨厌匈牙利表示法 变量名中那些愚蠢的前缀 使代码看起来丑陋且几乎不可读 但是正如您可能知道的那样 它绝对无
  • C++中make_shared和普通shared_ptr的区别

    std shared ptr p1 std make shared foo std shared ptr p2 new Object foo 许多谷歌和 stackoverflow 帖子都在这方面 但我无法理解为什么make shared比
  • 在 C 中将可变长度数组声明为全局变量

    如何将可变长度数组声明为全局变量 当在扫描长度之前在函数中声明可变长度数组时 它会编译但不会运行 它给出了分段错误 当相同的声明语句移动到扫描语句下方时 它运行良好 如果我们想要一个全局可用于所有函数的可变长度数组 我们该怎么做呢 这里的问
  • 将 XAML PathGeometry 转换为 WPF PathGeometry

    我想要由 LineSegment 组成的 PathGeometry 所以 我使用第一个代码 但它是错误的 PathGeometry temp PathGeometry Geometry Parse
  • 使用 textFileStream 的 Python Spark Streaming 示例不起作用。为什么?

    我使用spark 1 3 1和Python 2 7 这是我第一次体验 Spark Streaming 我尝试使用 Spark Streaming 从文件中读取数据的代码示例 这是示例的链接 https github com apache s
  • pandas 系列的 groupby 不起作用

    我无法对 pandas Series 对象进行 groupby 数据帧很好 但我似乎无法对系列进行分组 有人能够让它发挥作用吗 gt gt gt import pandas as pd gt gt gt a pd Series 1 2 3
  • Go 中任意精度常量的目的是什么?

    Go 具有任意大小和精度的无类型精确数值常量 这spec requires https golang org ref spec Constants所有编译器都支持至少 256 位的整数 以及至少 272 位的浮点数 尾数为 256 位 指数
  • Feign Hystrix 回退不起作用

    我有以下 FeignClient FeignClient name FooMS fallback CustomerFeign CustomerFeignImpl class public interface CustomerFeign Re
  • Rails 3 UTF-8 查询字符串显示在 URL 中?

    我的主页 上有一个搜索查询表单 当我提交此搜索表单时 我希望最终到达 search query foo 但是 现在我得到 search utf8 E2 9C 93 query foo 那个 utf8 参数在那里做什么 我怎样才能摆脱它 Th
  • 为什么我所有的看跌期权都返回 =>nil?

    我知道这似乎是一个非常简单的问题 但我的看跌期权不断生成 gt nil 这真的让我很困扰 我寻找答案但找不到答案 谢谢 把 眨眼 4 眨眼眨眼眨眼 gt 无 因为那是返回值puts put obj nil 将给定对象写入 ios 与 IO
  • 使用 Nhibernate 在子查询中仅选择不带 group by 属性的 max 子句

    我有这样的 SQL 查询 select from dbo table1 where Id in select max id as id from dbo table1 group by prop1 prop2 prop3 我想创建 NHib
  • Runtime.getRuntime().exec(String[]) 安全性

    我正在使用 Runtime getRuntime exec String 来运行进程 其中 String 数组的某些元素是由用户定义的 这安全吗 或者它允许将代码注入终端吗 如果不安全 我该怎么做才能避免代码注入 它必须是平台独立的 正如我
  • 如何在迭代时向列表添加值[重复]

    这个问题在这里已经有答案了 我有一个这样的场景 List
  • Android-R.java 文件未找到

    在处理 android 项目时 我被 R java 文件困住了 即使我清理项目 项目 gt clean 也找不到该文件 但该文件仍然找不到 即使我创建一个相同的新项目出现问题 我需要做什么 我期待有价值的答复 以便我可以克服这个问题 R j
  • 不知道如何导出 Objective-C 类。 i386 体系结构的未定义符号

    我正在尝试在 OSX 上的 GTK 上做一些工作 但遇到了一些麻烦 因为说实话 我对 Objective C 不太熟悉 我有足够的编程经验 可以很快掌握基本语法 并且可以在文档中查找我需要的内容 但我遇到的问题与链接库并将类暴露给我链接的程
  • 使用 Linkify.addLinks 与 Html.fromHtml 结合使用

    我有一个TextView通过调用以下命令获取其数据集 tv setText Html fromHtml myText 字符串myText包含部分格式化的 html 数据 例如 它可能有字体标签 但没有任何使用格式设置的 url 链接 a h
  • 通过 MsBuildProj 文件转换多个项目的多个配置文件

    我正在尝试根据模式 所有形式的文件 在文件列表上运行多个命令 config在给定目录的子目录下 如下所示