gpt4 book ai didi

ruby - 为 Rake 任务指定文件先决条件

转载 作者:太空宇宙 更新时间:2023-11-03 18:27:54 25 4
gpt4 key购买 nike

我有一个助手类可以扫描我的整个项目目录并收集源文件列表和相应的(目标)目标文件。扫描源目录后定义编译任务的依赖关系,如下所示。

CLEAN.include(FileList[obj_dir + '**/*.o'])
CLOBBER.include(FileList[exe_dir + '**/*.exe'])

$proj = DirectoryParser.new(src_dir)

$proj.source_files.each do |source_file|
file source_file.obj_file do
sh "gcc -c ..."
end
end

$proj.obj_files.each do |obj_file|
task :compile => obj_file
end

task :compile do
end

由于 $proj 是全局的,因此在调用任何任务(包括 cleanclobber)时都会调用 DirectoryParser.new()。这会使 cleanclobber 任务变慢,这是不可取的。

为了解决这个问题,我将所有文件依赖项的生成都移到了默认任务中。这使我的 cleanclobber 任务很快,但是,我现在不能独立调用我的编译或链接任务。

CLEAN.include(FileList[obj_dir + '**/*.o'])
CLOBBER.include(FileList[exe_dir + '**/*.exe'])

task :compile => $proj.source_files do # Throws error!
end

task :default => do
$proj = DirectoryParser.new(src_dir)

$proj.source_files.each do |source_file|
file source_file.obj_file do
sh "gcc -c ..."
end
end

$proj.obj_files.each do |obj_file|
task :compile => obj_file
end

... compile
... link
... execute
end

如何解决这个问题?我相信以前有人遇到过类似的问题。如果有任何帮助,我将不胜感激。

最佳答案

您可以尝试两步走的方法。

创建一个新任务generate_dependencies。此任务使用您的依赖项和操作构建一个(静态)rake 文件。

这个生成的 rakefile 可以加载到你的 rake 文件中。

一些示例代码(未经测试):

GENERATED = 'generated_dependencies.rb'

task :generate_dependencies do
$proj = DirectoryParser.new(src_dir)

File.open(GENERATED, 'w') do |f|
$proj.source_files.each do |source_file|
f << <<-code
file #{source_file.obj_file} do
sh "gcc -c " #etc.
end
code
end

$proj.obj_files.each do |obj_file|
f << "task :compile => #{obj_file}"
end

#~ ... compile
#~ ... link
#~ ... execute
end
end

require GENERATED

现在你有两个步骤:

  1. 创建一个空的“generated_dependencies.rb”(这样您第一次调用脚本时就不会出错)
  2. 调用 rake generate_dependencies
  3. 检查生成的文件——如果不好,更换生成器;)
  4. 调用 rake compilerake link(如果您想使用默认任务,则调用 rake)... -依赖项在生成的文件中定义。

    • 当发生变化(新文件)时,从第 2 步继续。
    • 如果结构保持不变(没有新文件,只有代码更改),您只需执行第 4 步。

关于ruby - 为 Rake 任务指定文件先决条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8284278/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com