当源文件和目标文件具有相同的后缀时,SCons 报告依赖循环
SCons reports a dependency cycle when source and target file have the same suffix
出于持续集成的原因,我正在尝试让 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”,但在其他情况下,输出文件与某些任意输入源具有相同的 leader-path/filename。
我是不是对 SCons 有误解?或者有人可以指出我解决这个问题的正确方向吗?
因为如果这是“这不是错误而是功能”适用的情况之一,我将竭尽全力。 :)
谢谢!
我真的很抱歉你和你的头发,但这种行为与variant_dir没有任何关系,"duplicate"选项也不会帮助你。
您的示例归结为:
- 您有一个文件“
app.js
”。
- 您有一个
Uglify
生成器,将 *.js
个文件映射到 *.js
个文件。
- 您告诉这个 Builder 使用“
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')
出于持续集成的原因,我正在尝试让 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”,但在其他情况下,输出文件与某些任意输入源具有相同的 leader-path/filename。
我是不是对 SCons 有误解?或者有人可以指出我解决这个问题的正确方向吗?
因为如果这是“这不是错误而是功能”适用的情况之一,我将竭尽全力。 :)
谢谢!
我真的很抱歉你和你的头发,但这种行为与variant_dir没有任何关系,"duplicate"选项也不会帮助你。 您的示例归结为:
- 您有一个文件“
app.js
”。 - 您有一个
Uglify
生成器,将*.js
个文件映射到*.js
个文件。 - 您告诉这个 Builder 使用“
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')