一个开源项目使用CMake来构建它的项目文件。
我不同意CMake - 这是一个10mb的安装程序,可以为几百kb的源创建批处理文件,即使这样,它也会将开发人员路径硬编码到输出中。它根本不做相对路径,也不使用Visual Studio提供的方便的宏。
所以我决定环顾四周。 Gyp看起来很有希望,但它再次依赖于安装了Python的用户,这又回到了我不喜欢CMake的原因。至少它不会硬编码路径。
所以我考虑使用批处理文件,并简单查找和替换,但由于项目文件是xml,为什么不使用XSLT?所以在这里搜索一下ran across this page,这似乎表明我想以非常简单的方式做什么。
所以我将Dimitre Novatchev的答案编辑成以下内容:
<xsl:template match="OutDir/text()">
<xsl:text>Diferent text</xsl:text>
</xsl:template>
希望找到以下内容并进行更改:
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">U:\unittest-cpp-pj\vs_projects\vs2012_x86\Debug\</OutDir>
然而,这不起作用 - 使用VS2010 xslt调试器它甚至没有中断。我不想花费数月时间学习如何正确使用XSLT,因为这看似简单。我需要的只是我可以用28 xml文件激活的东西。
一旦我开始工作,我将扩展它以用正确的值替换字段。
更新:这是整个XSLT:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="OutDir/text()">
<xsl:text>Diferent text</xsl:text>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:1)
根据@Tim C的建议,如果存在命名空间问题,这就是你可以解决的问题。
假设这样的输入文件(注意根目录上的名称空间声明):
<?xml version="1.0" encoding="utf-8"?>
<root xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<other/>
<other/>
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">U:\unittest-cpp-pj\vs_projects\vs2012_x86\Debug\</OutDir>
<other/>
</root>
使用此样式表(请注意,我已声明另一个名称空间“ms”):
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ms="http://schemas.microsoft.com/developer/msbuild/2003">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ms:OutDir/text()">
<xsl:text>Different text</xsl:text>
</xsl:template>
</xsl:stylesheet>
之前没有捕获OutDir元素,因为它继承了root的命名空间。没有命名空间的OutDir元素(这是你尝试过的)与ms:OutDir与命名空间不同 - 至少对于XSLT处理器而言。