【问题标题】:SCons reports a dependency cycle when source and target file have the same suffix当源文件和目标文件具有相同的后缀时,SCons 报告依赖循环
【发布时间】:2016-01-20 16:57:39
【问题描述】:

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

但是,即使将“duplicate=False”标志传递给“env.SConscript”调用;以防止 scons 将源复制到构建输出文件夹。它将具有相同源和目标扩展名的文件标记为依赖循环。以以下简化的项目结构为例:

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 吗?或者有人可以指出我解决这个问题的正确方向吗?

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

谢谢!

【问题讨论】:

    标签: scons build-system


    【解决方案1】:

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

    • 您有一个文件“app.js”。
    • 您有一个Uglify 生成器,将*.js 文件映射到*.js 文件。
    • 你告诉这个 Builder 用“app.js”做他的事情。

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

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

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

    【讨论】:

    • 感谢您的回答,恐怕确实如此。基于什么理由“当然这会导致依赖循环,因为您的源和目标具有相同的文件名。”合乎逻辑的事情。如果禁用源文件的复制,您实际上是在分离输入和输出路径。因此,恕我直言,独立处理与项目根不同的子树中的路径也是有意义的。至于为什么 SCons 会在目标路径中查找源文件,除非明确询问,例如当目标成为另一个目标的源时。
    • duplicate 选项没有按照您的预期进行。构建实际上发生在“变体目录”中(注意,这只是一个心理概念),并且通常所有源文件都被复制到“变体目录”(duplicate=1)。通过设置“duplicate=0”,您只需允许 SCons 使用“远程源”文件以及当前构建步骤中它来自的文件夹的路径。但这并不妨碍 SCons 检测到本地目标节点“app.js”和本地源节点“app.js”之间的循环依赖。
    • 只有在解决了这种歧义并尝试访问和读取文件的内容后,SCons 才会将其名称和路径解析为本地“app.js”(如果存在)或“app .js”在远程源文件夹中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多