使用rake复制保留目录结构的文件

时间:2012-09-30 20:49:57

标签: ruby rake rakefile

我的目标是将模式指定的一组文件复制到目标目录。源目录中的文件可以包含子目录。

我试过了:

cp_r(Dir.glob('**/*.html'), @target_dir):

cp_r(FileList['**/*.html'], @target_dir):

但都不起作用。

它仅在我执行以下操作时才有效:

cp_r(Dir['.'], @target_dir):

但我只需复制* .html文件而不是其他任何文件。

我需要什么

cp --parents

命令

使用现有Ruby / Rake方法的建议吗?

UPDATE 看起来像使用Ant更容易做的事情,使用Ruby / Rake堆栈是不可能的 - 可能我需要查看其他内容。我不想编写自定义代码以使其在Ruby中工作。我只是想到Ruby / Rake作为适当的解决方案。

更新2 这就是我使用Ant

的方式
<target name="buildeweb" description="Builds web site" depends="clean">
    <mkdir dir="${build.dir.web}" />

    <copy todir="${build.dir.web}" verbose="true">
        <fileset dir="${source.dir.web}">
            <include name="**/*.html" />
            <include name="**/*.htm" />
        </fileset>
    </copy>

    <chmod perm="a+x">
        <fileset dir="${build.dir.web}">
            <include name="**/*.html" />
            <include name="**/*.htm" />
        </fileset>
    </chmod>
</target>

3 个答案:

答案 0 :(得分:6)

如果你想要纯Ruby,你可以这样做(在标准库中的FileUtils的帮助下)。

require 'fileutils'

Dir.glob('**/*.html').each do |file|
  dir, filename = File.dirname(file), File.basename(file)
  dest = File.join(@target_dir, dir)
  FileUtils.mkdir_p(dest)
  FileUtils.copy_file(file, File.join(dest,filename))
end

答案 1 :(得分:0)

我没有听说过cp --parents,但如果它能够满足您的需求,那么只需在您的Rakefile中使用它就不会感到羞耻,如下所示:

system("cp --parents #{your} #{args}")

答案 2 :(得分:0)

这可能很有用:

# copy "files" to "dest" with any sub-folders after "src_root". 
def copy_and_preserve files, dest, src_root
  files.each {|f|
    f.slice! src_root # the files without src_root dir
    dest_dir = File.dirname(File.join(dest, f))
    FileUtils.mkdir_p dest_dir # make dest dir
    FileUtils.cp(File.join(src_root, f), dest_dir, {:verbose => true})
  }
end