调用可重用的 msbuild 目标时将列表项传递给 Properties

2024-05-16

我正在尝试在 msbuild 中创建一个可重用的目标,遵循中概述的基本模型如何调用同一个 msbuild 目标两次? https://stackoverflow.com/questions/1332731/how-to-invoke-the-same-msbuild-target-twice

我试图传递一个我想解释为列表的属性。我在网上没有找到处理这种情况的例子。据我了解,问题在于 Properties 已经被视为列表项,因此它不喜欢传入列表项。有没有办法让 msbuild 在这里正确打包和解包列表?

Msbuild 抱怨:

error MSB4012: The expression "FilesToZip=@(Scripts)" cannot be used in this context. Item lists cannot be concatenated with other strings where an item list is expected. Use a semicolon to separate multiple item lists.

这是一个调用者示例:

<Target Name="BuildMigrationZip">

   <MSBuild Projects="BuildZip.msbuild"
      Targets="BuildZip"
      Properties="FilesToZip=@(Scripts);OutputZipFile=$(MigrationPackageFilePath);OutputFolder=$(MigrationPackagePath);Flatten=true"/>

  <Message Text="Created database migration zip: $(MigrationPackageFilePath)" Importance="high"/>

</Target>

和基本目标:

<Target Name="BuildZip">

  <MakeDir Directories="$(OutputFolder)"/>

  <Zip Files="@(FilesToZip)" 
  ZipFileName="$(OutputZipFile)"
  Flatten="$(Flatten)"
  ParallelCompression="false" />

</Target>

我基本上正要回去剪切和粘贴这些内容,尽管我想在这里打包一些拉链。

UPDATE:同样的问题也适用于在可重用目标上设置输入。到目前为止,我的问题解决了原始功能,但保持依赖关系正常工作会很好。例如:

<Target Name="BuildZip"
   Inputs="@(FilesToZip)"
   Outputs="$(OutputZipFile)">

  <MakeDir Directories="$(OutputFolder)"/>

  <Zip Files="@(FilesToZip)" 
  ZipFileName="$(OutputZipFile)"
  Flatten="$(Flatten)"
  ParallelCompression="false" />

</Target>

他们的关键是将列表作为属性传递。所以当你的Scripts列表定义为

<ItemGroup>
  <Scripts Include="A"/>
  <Scripts Include="B"/>
  <Scripts Include="C"/>
</ItemGroup>

然后你首先将它转换为一个属性(这只是用分号分隔项目,但 msbuild 知道如何通过Properties of the MSBuildtarget)然后将其传递给目标:

<Target Name="BuildMigrationZip">
  <PropertyGroup>
    <ScriptsProperty>@(Scripts)</ScriptsProperty>
  </PropertyGroup>

  <MSBuild Projects="$(MSBuildThisFile)" Targets="BuildZip"
           Properties="FilesToZip=$(ScriptsProperty)" />
</Target>

(注意我正在使用$(MSBuildThisFile)这里:您不一定需要为每个目标创建单独的构建文件,事实上,对于像您这样的小目标,将其放在同一个文件中要方便得多)

然后在您的目标目标中再次将属性转换为列表:

<Target Name="BuildZip">
  <ItemGroup>
    <FilesToZipList Include="$(FilesToZip)"/>
  </ItemGroup>
  <Message Text="BuildZip: @(FilesToZipList)" />
</Target>

Output:

BuildZip: A;B;C

Update

当与Inputs, 你无法通过@(FilesToZip)因为它扩展为空,因为它不是一个列表:它是一个属性 - 它恰好是许多用分号分隔的字符串。因此,它可用于Inputs您只需将其扩展为属性即可,即$(FilesToZip):

<Target Name="BuildZip"
        Inputs="$(FilesToZip)"
        Outputs="$(OutputZipFile)">
  ...
</Target>

第二次运行的输出:

BuildZip:
Skipping target "BuildZip" because all output files are up-to-date with respect to the input files.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

调用可重用的 msbuild 目标时将列表项传递给 Properties 的相关文章

  • WIX 目标文件由 LFN 系统上的两个不同组件安装在 [ProgramFilesFolder] 中:这会破坏组件引用计数

    我正在使用 WIX 通过 TFS MSBuild 生成 msi 破坏构建的错误 不仅仅是警告 是 ICE30 The target file eiycriw9 exe MyApp exe is installed in ProgramFil
  • 使用 msbuild 复制所有文件和文件夹

    只是想知道是否有人可以帮助我编写一些我正在尝试编写的 msbuild 脚本 我想要做的是使用 msbuild 将所有文件和子文件夹从一个文件夹复制到另一个文件夹 ProjectName gt Source gt Tools gt Viewe
  • 参考新 CSPROJ 格式的 GAC 程序集?

    我使用的是 Visual Studio 2019 预览版 2 1 我有一个 NET Framework 4 6 1 类库 C 项目 其中有一些采用旧 csproj 项目格式 ToolsVersion 15 0 的 Azure 引用 这个旧的
  • TeamCity:如何告诉 MSBuild 考虑发布配置文件参数?

    当我想使用发布配置文件编译我的项目时 我使用 MSBuild 步骤进行 TeamCity 构建配置 我的发布配置文件位于MyProject Properties PublishProfiles profile pubxml 我的配置文件 p
  • 如何在 MSBuild 中的 Exec 命令中转义引号

    我正在尝试构建一个 MSBuild 脚本 将网络驱动器映射到脚本中的驱动器号 但不幸的是目标文件夹的路径包含嵌入的空格 嵌入的空格导致映射失败 我不知道是否可以转义路径周围的引号 我尝试过双引号 但 MSBuild 不喜欢它 要么是 Win
  • MSBuild:部署未包含在项目中的文件

    我在一个 Web 项目上有一个预构建事件 该事件使用 Node js 缩小并连接 javascript 文件 这会在脚本文件夹中创建一个名为 BuiltScripts 的文件夹 该文件夹与脚本文件夹重复 只是文件被缩小了 当我进行部署时 我
  • 通过命令行的 MSbuild 包不包括我的所有程序集

    我正在尝试设置一个部署脚本来发布我们的网站 而不是必须打开 VS 来进行部署 发布 当我通过 VS 进行发布时 它将正确包含所有引用的程序集 但是当我通过命令行进行发布时 它不会 我对我所缺少的东西感到迷失 我的 MSBuild 命令是 m
  • 如何使用 AssemblyInfo 任务更改程序集版本号?

    我正在尝试自动化为所有 DLL 设置版本的过程 在花了一些时间后我开始了解AssemblyInfo最有可能实现的任务 所以我继续安装它 特别是版本1 0 51130 0 安装后我手动添加了Import标签 通过卸载每个项目 Assembly
  • 关于 .net core 的 csproj 格式的完整文档在哪里?

    是否有关于 net core 项目的 csproj 格式的完整文档 我一直在寻找一种在构建之前复制文件的方法 经过一番搜索后 我找到了解决方案 但我找不到这方面的文档 它会覆盖文件吗 有没有额外的选择
  • 从 MSBuild 中的文件读取单个值

    我正在尝试从 MSBuild 中的文件读取版本号
  • 如何使用 MSBuild 构建 Visual Studio 安装项目

    我正在尝试使用 MSBuild 使用以下文章构建 Visual Studio 安装项目 http msdn microsoft com en us library ms404859 aspx https web archive org we
  • ASP.NET:如何使用命令行在文件夹中发布

    我想将 ASP NETFramework v4 6 1 项目发布到本地文件夹 没有拉链 没有个人资料 只是这样的出版物 msbuild MySolution sln t MyProject p Configuration DEBUG p p
  • 文件夹结构中的链接文件

    在 Visual Studio 中 当我将文件从一个项目链接到下一个项目时 在尝试加载链接的资源时出现以下错误 仅当链接文件位于文件夹内时才会发生这种情况 Error Message pack application projectName
  • 使用 Visual Studio 复制文件?

    我想创建一个 Visual Studio 我正在使用 VSTS 2008 项目 它只执行文件复制工作 更详细地说 我将向该项目添加一些文件 并将该项目复制文件 包含在该项目中 到某个目标位置我构建该项目 有什么想法如何在 VSTS 中做到这
  • TFS Build 未按预期转换 web.config

    目标是让 TFS 构建和部署 2 个以上不同的配置 并让 web config 转换文件在其输出中包含预期内容 这是一个 ASP NET MVC 项目 Web 调试 配置 参见 PasteBin http pastebin com 9Zwb
  • MSBuild 复制或创建文件(如果不存在)

    我有一个简单的要求 即在项目目录中创建一个名为 user config 的文件 但前提是该文件尚不存在 第一次尝试
  • 没有 Visual Studio 的 Microsoft 代码合同

    这个堆栈溢出问题 Microsoft 代码合同和 CI 构建服务器 https stackoverflow com questions 3569108 microsoft code contracts and ci build server
  • Visual Studio 2012 解决方案 TeamCity 中的 MSBuild

    我有一个 VS 2012 Web 项目 sln 我正在尝试在 TeamCity 中构建它 它使用安装在 TeamCity 上的 NET 4 5 TeamCity 服务器有仅安装了 VS 2010 构建运行时出现此错误 C BuildAgen
  • pubxml Web 发布工具事件生命周期

    我正在使用 Visual Studio 2012 中的 Web 发布工具发布到文件系统 我了解到我可以打开 Properties 文件夹中的 pubxml 来执行更高级的操作 我想要做的是在发布任务结束时运行命令行应用程序 我通常会在自定义
  • MSBuild 与编译器

    从命令提示符使用 MSBuild 和 C 编译器有什么区别 我想在不使用 Visual Studio 的情况下手动构建我的解决方案 项目 并且我想学习如何使用命令行工具 C 编译器你的意思是csc exe 如果这就是你的意思 那么csc a

随机推荐

  • 主题以编程方式设置。如何重新加载 Activity 来应用

    如何在不重新启动整个应用程序的情况下应用主题 如果我这样做startActivity getIntent finish 活动退出并且不重新启动 是否可以简单地重新启动 重新创建活动来应用主题 它的顺序不正确 finish intent ne
  • 针对特定值的 Linq OrderBy

    Linq 中是否有一种方法可以在不知道值的顺序的情况下对一组值 在本例中为字符串 执行 OrderBy 考虑这个数据 A B A C B C D E 以及这些变量 字符串第一优先 第二优先 第三优先 当值设置如下时 firstPref A
  • 如何正确地将 Facebook JavaScript SDK 注入 AngularJS 控制器?

    我是 AnuglarJS 的新手 并且已经用它构建了一个小型网络应用程序 我想将 Facebook JavaScript SDK 与它一起使用 但使用最佳实践 依赖项注入控制器 以维护应用程序结构和可测试性 我找到了这个https grou
  • Play 框架:从 Build.sbt 读取版本

    我看到了很多关于如何从 build sbt 读取版本的问题 并且已经提供了很多解决方法来解决如何将 build sbt 指向 conf application conf 并在中指定版本改为conf application conf 我有一个
  • 将roottools.jar导入Android Studio

    我正在尝试从这里导入 roottools https code google com p roottools https code google com p roottools jar 文件 到 Android Studio 项目 到目前为
  • 将 Dropout 与 Keras 和 LSTM/GRU 单元结合使用

    在 Keras 中 您可以像这样指定 dropout 层 model add Dropout 0 5 但对于 GRU 单元 您可以将 dropout 指定为构造函数中的参数 model add GRU units 512 return se
  • 序列化表达式树

    我正在用 C 做一个分布式系统 并且遇到了障碍 我需要能够使用类型序列化谓词 Predicate
  • 如果文件为空,如何跳过文件行

    python 3中的程序 这是我的第一个涉及文件的程序 我需要忽略注释行 以 开头 和空行 然后拆分这些行 以便它们可迭代 但我不断收到 IndexError 消息 指出字符串索引超出范围 并且程序在空行处崩溃 import os path
  • ssl.SSLEOFError: EOF 发生违反协议 (_ssl.c:1129)

    我正在尝试使用 GOOGLE Drive Api 从电脑上传多个文件到云端硬盘 from pydrive auth import GoogleAuth from pydrive drive import GoogleDrive import
  • Jenkins:在管道 Jenkins 文件内执行 AWS CLI 命令

    您知道如何在 aws 中执行 AWS CLI 命令吗 Jenkinsfile为了建立管道 我没有找到任何插件 首先 您需要在服务器上安装 aws cli 并确保 jenkins 用户有权运行它 或者在创建 EC2 实例时简单地使用 Amaz
  • 在应用程序创建完成时设置 Spark DataGrid 列的默认排序(Flex 4.5)

    我有一个包含多个列的 Spark DataGrid 组件 我希望我的应用程序默认按 DataGrid 中第一列的降序排列 我想使用单击顶部标题一次时发生的内置默认排序 我不需要对我正在使用的 ArrayCollection 进行排序或更改比
  • Locale.getDefault() 始终返回 en

    unix 机器上的服务器始终使用 en 作为默认区域设置 以下是区域设置输出 LANG en US LC CTYPE C LC NUMERIC C LC TIME C LC COLLATE C LC MONETARY C LC MESSAG
  • 数学组合的完美最小哈希

    首先定义两个整数N and K where N gt K 两者都在编译时已知 例如 N 8 and K 3 接下来 定义一组整数 0 N or 1 N 如果这使答案更简单 并调用它S 例如 0 1 2 3 4 5 6 7 的子集数量S wi
  • 构建动态 ConstraintViolation 错误消息

    我写了一个由自定义实现的验证注释ConstraintValidator 我也想生成非常具体的ConstraintViolation使用消息插值期间验证过程中计算的值的对象 public class CustomValidator imple
  • R data.table 多个条件连接

    我设计了一种解决方案 用于从两个单独数据表的多个列中查找值 并添加基于新列的值计算 多个条件比较 代码如下 它涉及在计算两个表中的值时使用 data table 和联接 但是 这些表没有联接在我正在比较的列上 因此我怀疑我可能无法获得 da
  • 尝试修改 MC Forge 1.12.2,但 SetupDecompWorkspace 无法正常工作

    我正在尝试为 Minecraft Forge 1 12 2 制作一个 mod mdk 文件 forge 1 12 2 14 23 5 2854 mdk 问题是 当我右键单击该文件夹时 打开 Powershell 并运行 gradlew se
  • JavaScript 单行“if”语句 - 最好的语法,这个替代方案吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 尽管意见仍然如此 但已经明确指出 放弃单行中的大括号if语句的可维护性和可读性并不理想 但这又如何呢 if lemons document wr
  • 有关 paddingStart 使用的冲突 lint 消息

    API 17 RTL 支持发布后 我将以下内容添加到我的清单中 android supportsRtl true 这导致 Lint 在我的视图中有 paddingLeft Right 的地方正确地向我发出这些警告 考虑添加 android
  • 接收字母并返回字母表中(从 0 开始)数字位置的 Python 函数

    我正在尝试创建一个 Python 函数 它接收一个字母 只有一个字母字符的字符串 并返回该字母在字母表中从 0 开始的数字位置 它不应该区分大小写 而且我不能使用导入 所以输入 a 应该返回 0 输入 A 也应该返回 0 输入 O 应该返回
  • 调用可重用的 msbuild 目标时将列表项传递给 Properties

    我正在尝试在 msbuild 中创建一个可重用的目标 遵循中概述的基本模型如何调用同一个 msbuild 目标两次 https stackoverflow com questions 1332731 how to invoke the sa