代码之家  ›  专栏  ›  技术社区  ›  Royke

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

  •  1
  • Royke  · 技术社区  · 8 年前

    出于持续集成的原因,我正在尝试让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?或者有人能给我指出解决这个问题的正确方向吗?

    因为如果这是“这不是一个bug,这是一个特性”的情况之一,我会把头发拔出来

    谢谢

    1 回复  |  直到 8 年前
        1
  •  0
  •   dirkbaechle    8 年前

    我真的很抱歉你和你的头发,但这种行为与variant_dir无关,“复制”选项也不会帮你。 您的示例可以归结为:

    • 你有一个文件“ app.js ".
    • 你有一个 Uglify 生成器,映射 *.js 文件到 *.js文件 文件夹。
    • 你告诉这位建设者用“ 应用程序.js ".

    当然,这会导致依赖循环,因为源和目标具有相同的文件名。注意,SCons从 build/debug/.../app.js 对自己…和 applications/frontend/scripts/app.js .

    为了打破这个循环,您必须重命名其中一个后缀( *.in 对于源文件?),或文件干,例如,您可以将源文件命名为“ app_pretty.js “然后打电话

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