2

私の会社はmakeからsconsに切り替えています。私たちの make プロセスの一部は、いくつかの 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 に入力ファイルを提供する必要があります。現在、ビルダーの「レシピ」にソース ファイルがハードコードされています。アクション文字列で 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 に答える