在 MSBuild 中,我可以在元数据项上使用 String.Replace 函数吗?

2024-03-19

在 MSBuild v4 中,可以使用函数(例如string.replace) on 特性。但是我怎样才能使用函数Metadata?

我想使用string.replace功能如下:

<Target Name="Build">
  <Message Text="@(Files->'%(Filename).Replace(&quot;.config&quot;,&quot;&quot;)')" />
</Target>   

不幸的是,这输出为(不完全是我想要的):

log4net.Replace(".config","");ajaxPro.Replace(".config","");appSettings.Replace(".config","");cachingConfiguration20.Replace(".config","");cmsSiteConfiguration.Replace(".config","");dataProductsGraphConfiguration.Replace(".config","");ajaxPro.Replace(".config","");appSettings.Replace(".config","");cachingConfiguration20.Replace(".config","");cmsSiteConfiguration

有什么想法吗?


你可以通过一些技巧来做到这一点:

$([System.String]::Copy('%(Filename)').Replace('config',''))

基本上,我们调用静态方法“Copy”来创建一个新字符串(由于某种原因,如果您尝试这样做,它不喜欢它)$('%(Filename)'.Replace('.config',''))),然后对字符串调用替换函数。

全文应如下所示:

<Target Name="Build">
        <Message Text="@(Files->'$([System.String]::Copy(&quot;%(Filename)&quot;).Replace(&quot;.config&quot;,&quot;&quot;))')" />
</Target>

Edit:MSBuild 12.0似乎已经打破了上述方法。作为替代方案,我们可以向所有现有的元数据条目添加新的元数据条目Files项目。我们在定义元数据项时执行替换,然后我们可以像任何其他元数据项一样访问修改后的值。

e.g.

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

    <ItemGroup>
        <Files Include="Alice.jpg"/>
        <Files Include="Bob.not-config.gif"/>
        <Files Include="Charlie.config.txt"/>
    </ItemGroup>

    <Target Name="Build">
        <ItemGroup>
            <!-- 
            Modify all existing 'Files' items so that they contain an entry where we have done our replace.
            Note: This needs to be done WITHIN the '<Target>' (it's a requirment for modifying existing items like this
            -->
            <Files>
                <FilenameWithoutConfig>$([System.String]::Copy('%(Filename)').Replace('.config', ''))</FilenameWithoutConfig>
            </Files>
        </ItemGroup>

        <Message Text="@(Files->'%(FilenameWithoutConfig)')" Importance="high" />
    </Target>
</Project>

Result:

D:\temp>"c:\Program Files (x86)\MSBuild\12.0\Bin\MSBuild.exe" /nologo test.xml
Build started 2015/02/11 11:19:10 AM.
Project "D:\temp\test.xml" on node 1 (default targets).
Build:
  Alice;Bob.not-config;Charlie
Done Building Project "D:\temp\test.xml" (default targets).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 MSBuild 中,我可以在元数据项上使用 String.Replace 函数吗? 的相关文章

  • 构建失败 - TFS2008 上的 VS2010 解决方案

    我已将 VS2008 ASP NET MVC 解决方案迁移到 VS2010 MVC2 NET 4 0 该解决方案在本地构建 并且所有单元测试都通过 我们的 TFS 服务器仍然是 TFS2008 我在通过 CI 构建时遇到问题 项目全部构建成
  • TFS 2017 - 构建服务器不构建 Visual Studio 2017

    上周在我的构建服务器上升级 Visual Studio 2017 后 MS Build 15 0 不再使用 因此 每当我尝试编译使用新功能的 Visual Studio 2017 项目时 它们都会失败 构建日志中的警告是 找不到 Visua
  • 英特尔编译器使用错误的标头

    我试图找出为什么Intel Compiler 18 0 已安装after我的 Visual Studio 2017 安装使用的头文件MSVC 而不是它自己的 因为它会导致错误 一个简单的 include
  • 编译 XNA 项目时,无法执行请求的操作错误

    第二次编译项目时 出现以下错误消息 我必须关闭 VS 2010 重新加载时它会编译 如果我做出改变 那么问题又回来了 无法复制文件 obj x86 Debug MyFile dll 无法对打开的用户映射部分的文件执行请求的操作 我因为另一个
  • VSTS 构建失败并显示 MSB4184 路径不是合法形式

    我正在尝试使用 VSTS 中的构建系统来构建和部署 c net Web 应用程序 我创建了一个新的单项目解决方案 因为似乎没有任何方法可以指定在多项目解决方案中构建 部署哪个项目 并设置我的构建定义以指向这个新解决方案 我已将其设置为使用
  • 以编程方式调用 EntityDeploy 构建任务

    我正在使用 Roslyn 来编译 发出和运行 C 源代码 但是 在面对使用 EntityFramework 的项目时 我遇到了限制 似乎简单地发出编译是不够的 因为有一个EntityDeploy在 DLL 发出后对其进行操作的构建任务 我相
  • 无法从用法推断方法的类型参数

    namespace TestLibrary TestFixture public class Class1 public delegate T Initializer
  • TFS 构建失败,文件“无法复制文件”,甚至不在项目中

    我已经设置了 TFS Build 直到昨天为止都运行良好 从那时起 我从一个项目中收到以下错误 C Program Files x86 MSBuild Microsoft VisualStudio v11 0 WebApplications
  • 具有依赖项的自定义 MSBuild 任务

    我编写了一个使用第三方程序集的 MSBuild 任务 当我在项目中使用该任务时 MSBuild 抱怨它无法加载第三方程序集 毫不奇怪 我应该将第三方程序集放在哪里 以便 MSBuild 可以使用它们 我尝试向它们添加项目引用但没有成功 我不
  • SonarScanner (C#) 不支持代码内 StyleCop 警告抑制

    我正在尝试使用 SonarQube 为我的组织进行静态代码分析 我们所有的 C 项目都已经启用了 StyleCop 这在代码可读性方面对我们帮助很大 现在我们想利用 SonarQube 进行静态代码分析 我按照提供的指南成功在本地托管了 S
  • TFS 2010 - 构建后部署到多个服务器

    我已将 TFS 2010 配置为进行构建并利用 MSBuild 参数 将其部署到单个服务器 没有任何问题 p DeployOnBuild True p Configuration Development p DeployTarget MSD
  • 使用 msbuild 复制所有文件和文件夹

    只是想知道是否有人可以帮助我编写一些我正在尝试编写的 msbuild 脚本 我想要做的是使用 msbuild 将所有文件和子文件夹从一个文件夹复制到另一个文件夹 ProjectName gt Source gt Tools gt Viewe
  • TFS MSBuild:$(ProjectDir) 空白或随机

    我有一个 vcproj 文件 其中包含一个简单的预构建事件 大致如下 Helpertask exe ProjectDir 这在开发人员 PC 上运行良好 但是当解决方案在 MSBuild 下的 TFS 2008 构建服务器上构建时 Proj
  • msbuild 脚本中的其他路径

    如何为 MSBuild 任务指定其他程序集引用路径 到目前为止 我有以下脚本 但无法弄清楚如何指定其他搜索路径
  • 在哪里可以找到 Microsoft.Build.Utilities.v3.5

    如何获取 Microsoft Build Utilities v3 5 我正在使用 StyleCop 4 7 Stylecop dll 中的 StyleCop msbuild 任务似乎依赖于 Microsoft Build Utilitie
  • 看起来 MSVS 11.0 Beta 破坏了 MSVS 10.0 安装

    安装 MSVS 11Beta 后 我的 MSVS 10 遇到了编译问题 现在 当我在 MSVS 10 中编译 C 项目 在 MSVS 10 中创建的项目 目标框架 3 5 时 出现错误MSB4216 MSB4028输出窗口中包含以下文本 1
  • 禁用 ASP.NET Core 3.1 项目的 web.config 生成

    The dotnet publish我的 ASP NET Core 3 1 项目的命令创建了一个web config文件在我的publish 目录 我不希望生成此文件 或至少复制到该文件夹 它根本不能与 IIS 一起使用 当我查看更加详细的
  • MSB6003 无法运行指定的任务可执行文件“sgen.exe”。文件名或扩展名太长

    在 Windows 10 上运行 VS 2017 15 5 3 出现此一般错误 无法运行指定的任务可执行文件 sgen exe 文件名或扩展名太长 在Release配置和X64平台上构建项目时 但它在调试配置和任何 CPU 平台上都构建得很
  • 在全球范围内压制 StyleCop 警告

    如何在解决方案中全局抑制 StyleCop 警告 该解决方案是使用 Jenkins 持续构建和集成工具 持续构建的 并且应用了所有 StyleCop 规则 该解决方案使用 TAB 字符而不是 4 个空格 因为这是我的开发团队采用的标准 因此
  • 压缩未压缩的 MSI 文件

    我们有一个安装项目 它生成一个未压缩的 MSI 文件 并且根本没有 Setup exe 稍后由 NSIS 压缩 在特殊的构建设置中 我想在 NSIS 打包之前复制该 MSI 更改副本并保留它 我还想在 msbuild 创建它之后对其进行压缩

随机推荐