0

以下は、問題を説明する簡単なコード スニペットです。

def external_dependencies(url, destination):
           # this never gets called
           print 'whatever!'
           # if isinstance(url, basestring):
           #            urllib.urlretrieve(url, destination)
           # else:
           #            for a, b in map(None, url, destination):
           #                       urllib.urlretrieve(a, b)
           return None

env = Environment()
env.Command(['http://archive.apache.org/dist/xmlgraphics/batik/batik-1.6.zip',
             'http://archive.apache.org/dist/commons/collections/binaries/commons-collections-3.0.tar.gz',
             'http://archive.apache.org/dist/commons/logging/binaries/commons-logging-1.0.4.tar.gz'],
            ['./thirdparty/batik/batik-1.6.zip',
             './thirdparty/commons-collections-3.0.tar.gz',
             './thirdparty/commons-logging-1.0.4.tar.gz'],
            external_dependencies)

これを実行しようとすると、次のエラーが発生します。

scons: *** [http:/archive.apache.org/dist/commons/collections/binaries/commons-
collections-3.0.tar.gz] Source `thirdparty/batik/batik-1.6.zip' not found, 
needed by target `http:/archive.apache.org/dist/xmlgraphics/batik/batik-1.6.zip'.

(読みやすくするために改行が追加されています)

宛先はまだダウンロードされていないため、明らかに見つかりません。この操作の目的は、それをダウンロードすることです。

この動作をオーバーライドするには? ここで引数を検証することは、まったく逆効果です。

編集:

小さな更新: この方法で動作させることはできましたが、間違っている/ハックのように感じます:

def external_dependencies(dummy, url, destination):
           if isinstance(url, basestring):
                      urllib.urlretrieve(url, destination)
           else:
                      for a, b in map(None, url, destination):
                                 urllib.urlretrieve(a, b)
           return None

env = Environment()
env.AddMethod(external_dependencies, 'ExternalDependencies')

env.ExternalDependencies(
           ['http://archive.apache.org/dist/xmlgraphics/batik/batik-1.6.zip',
            'http://archive.apache.org/dist/commons/collections/binaries/commons-collections-3.0.tar.gz',
            'http://archive.apache.org/dist/commons/logging/binaries/commons-logging-1.0.4.tar.gz'],
           ['./thirdparty/batik/batik-1.6.zip',
            './thirdparty/commons-collections-3.0.tar.gz',
            './thirdparty/commons-logging-1.0.4.tar.gz'])

dummy- の引数に注意してください。external_dependencies何らかの理由で、SCons はこの関数を呼び出し、引数の数を最初の引数として渡します。ということで、使用目的が違ったようです。

4

1 に答える 1

0

Command() ビルダーの定義は次のとおりです。

Command(target, source, action, [key=val, ...])

したがって、パラメーターの順序が間違っているようです。URLリストがソースで、ファイルリストがターゲットだと思いますよね?

この場合、引数の順序を変更するか、次のようにすることができます。

Command(source=['http://archive.apache.org/dist/xmlgraphics/batik/batik-1.6.zip',
                'http://archive.apache.org/dist/commons/collections/binaries/commons-collections-3.0.tar.gz',
                'http://archive.apache.org/dist/commons/logging/binaries/commons-logging-1.0.4.tar.gz'],
        target=['./thirdparty/batik/batik-1.6.zip',
                './thirdparty/commons-collections-3.0.tar.gz',
                './thirdparty/commons-logging-1.0.4.tar.gz'],
        action=external_dependencies)

ただし、SCons はおそらく URL リストが実際にはファイル名のリストであると想定し、とにかくそれらを見つけようとする可能性があるため、これが機能するとはまだ確信していません。テストする必要があります。

試した 2 番目のオプションは実際にはビルダーではなく、単なる関数呼び出しであるため、依存関係のチェックはおそらく期待どおりにはなりません。あなたが言及した仮引数については、引数の数ではなく、関数が呼び出されたenvになると確信しています。

于 2012-08-31T15:15:09.363 に答える