SCons 报告源文件和目标文件具有相同后缀时的依赖关系循环



出于持续集成的原因,我试图让SCons在一系列JavaScript文件上调用uglify...

但是,即使"重复=假"标志被传递给"env"。SConscript'的调用;以防止 SCON 将源复制到生成输出文件夹。它将具有相同源和目标扩展名的文件标记为依赖项周期。以以下简化的项目结构为例:

SConstruct
applications/SConscript
applications/frontend/SConscript
applications/frontend/scripts/app.js
-- SContruct --
UglifyBuilder = env.Builder(
  action = 'uglify --source $SOURCE --output $TARGET',
  suffix = '.js',
  single_source = True)
env['BUILDERS']['Uglify'] = UglifyBuilder
env.SConscript('applictions/SConscript', 'env',
    variant_dir=os.path.join('build', 'debug', 'applications'),
    duplicate=False)
-- applications/SConscript --
env.SConscript('frontend/SConscript', 'env', duplicate=False)
-- applications/frontend/SConscript --
env.Uglify('scripts/app.js')

当您在此上运行 SCons 时(无论是否干净),将生成以下输出;声明目标文件之间存在依赖循环:

$ scons applications/frontend/
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
scons: building associated VariantDir targets: build/debug/applications/frontend
scons: `applications/frontend' is up to date.
scons: done building targets.
scons: *** Found dependency cycle(s):
  build/debug/applications/frontend/scripts/app.js -> build/debug/applications/frontend/scripts/app.js

我还尝试将绝对路径传递给源文件,但不幸的是结果相同。当然,我可以将输出后缀更改为".min.js",但还有其他情况可以提出与某些任意输入源具有相同引线路径/文件名的输出文件。

我在这里误解了SCons吗?或者有人可以指出我解决这个问题的正确方向吗?

因为如果这是"这不是一个错误,而是一个功能"适用的情况之一,我将拔掉我的头发。 :)

谢谢!

我真的很抱歉你和你的头发,但这种行为与variant_dir没有任何关系,"复制"选项也不会帮助你。您的示例归结为:

  • 您有一个文件" app.js "。
  • 您有一个Uglify生成器,用于将*.js文件映射到*.js文件。
  • 你告诉这个建造者用"app.js"做他的事情。

当然,这会导致依赖循环,因为源和目标具有相同的文件名。请注意,SCons 检测从build/debug/.../app.js到自身的循环......而不是applications/frontend/scripts/app.js.

为了打破这个循环,你必须重命名你的一个后缀(*.in源文件?),或者文件干,例如,你可以将你的源文件命名为"app_pretty.js",然后调用

env.Uglify('scripts/app.js', 'scripts/app_pretty.js')

最新更新