2

我的公司正在从 make 转向 scons。我们制作过程的一部分是在多个 xml 文件上调用 xmllint 以根据模式验证它们。

我的 SConstruct 中有以下内容:

import os;
Env = DefaultEnvironment()
pwd = Dir('.').path
xmlValidator = Builder(action = 'xmllint --noout  --schema '+pwd+'/path/schema.xsd '+pwd+'file.xml')
Env.Append(BUILDERS = {'ValidateXML' : xmlValidator})
Env.ValidateXML()

当我运行时:

scons -Q

我得到:

scons: `.' is up to date.

但是没有运行验证。

我究竟做错了什么?

我对 scons 完全陌生,并且对 Python 比较熟悉。

4

2 回答 2

3

您需要为 scons 提供输入文件。您当前已将源文件硬编码到构建器“recipe”中。最好在操作字符串中使用 SOURCE 占位符,然后在调用构建器时指定输入文件。

xmlValidator = Builder(action='xmllint --noout --schema '+
                               pwd+'/path/schema.xsd $SOURCE')
Env.Append(BUILDERS = {'ValidateXML' : xmlValidator})
Env.ValidateXML(source='file.xml')

这将始终运行验证,因此您可能希望将结果输出到文件。为此,您将使用 TARGET 占位符,例如:

xmlValidator = Builder(action='xmllint --schema '+
                       pwd+'/path/schema.xsd $SOURCE --output $TARGET')
Env.ValidateXML(source='file.xml', target="out.txt")
于 2009-12-01T08:46:52.473 回答
0

大概您还使用 XML 文件作为其他构建器的输入。通过使用具有多个操作的构建器,您可以改为在该阶段执行验证。像这样的东西:

xslt = Builder(action=['xmllint --noout --schema /path/to/schema.xsd $SOURCE',
                       'xsltproc --output $TARGET /path/to/style.xsl $SOURCE'])
Env.Append(BUILDERS = {'XSLT' : xslt})

使用此解决方案,无需创建任何不必要的文件。如果生成了 XML 文件,您可以类似地创建一个生成文件并执行验证的构建器。

于 2020-09-19T13:11:00.147 回答