如何使用 Rake 复制 .​​htaccess 文件?

How do I copy .htaccess files using Rake?

我正在使用 Rake 创建一些构建脚本,这些脚本将用作通过 Docker 容器将我们的 Web 服务部署到云的整个过程的一部分。为了实现这一点,我们使用 Rake 将来自多个 repos 的资源组合到 "assemble" directory/file 布局。除了一项 .htaccess 文件外,这一切都很好。

这是我创建的复制函数:

require 'fileutils'

EXT_ALLOWED = ["html", "css", "js", "svg", "otf", "eot", "ttf", "woff", "jpeg", "map", "ico", "map", "png", "db", "php", "conf"]

def copy_to(dest, src, trim="")

    files = FileList.new()
    EXT_ALLOWED.each {|ext| files.include "#{src}/**/*.#{ext}"}
    files.each do |file|
        dir = File.dirname(file)
        filename = File.basename(file)
        trimming = "/shared/" + trim + "(.*)"
        path = dir.match(trimming)
        if path == nil || dest == path[1] + '/'
            bin = dest
        else
            bin = File.join(dest, path[1] + '/')
        end
        puts "copying #{file} to #{bin}"
        FileUtils.mkdir_p(bin)
        FileUtils.cp file, bin
    end

end

它的用法是:

desc 'copies from shared/admin to the base server directory'
task :admin do
    # Copy admin over
    dest = 'www-server/'
    src = '../shared/admin'
    trim = "admin/"
    copy_to dest, src, trim
end

trim 变量用于确保将文件复制到适当的目录。在这种情况下,admin 中的文件将直接复制到 www-server,而没有 admin 子目录。

我天真地尝试将 "htaccess" 添加到 EXT_ALLOWED 数组,但失败了。

我也在网上关注了一些项目,但大多数与Octopress有关,并不能解决问题。

.htaccess 文件在 ../shared/admin 中,需要在 www-server/ 中结束,我可以在这个函数中实现吗?或者我需要专门为以点开头的文件名写一些东西吗?

在这种情况下,寻找一个快速而肮脏的(是的......我觉得这样做很肮脏!)选项,我写了一个函数专门在特定目录中查找 .htaccess 文件:

def copy_htaccess(src, dest)
    files = Dir.glob("#{src}/.*")
    files.each do |file|
        filename = File.basename(file)
        if filename == ".htaccess"
            puts "copying #{file} to #{dest}"
            FileUtils.mkdir_p(dest)
            FileUtils.cp file, dest
        end
    end
end

以这种方式执行用法:

desc 'copies the .htaccess file from one root to the web root'
task :htaccess do
    src = '../shared/admin'
    dest = 'www-server/'
    copy_htaccess src, dest
end

在这里,我可以使用 Dir.glob() 列出所有以 . 开头的文件,然后测试 .htaccess 文件并执行复制。

如果可能的话,我将研究修改单一复制功能的方法,以使其更清晰。也许这可以通过遍历目录并将以 . 开头的文件添加到 files 数组来完成。

编辑: 我发现我可以将 .htaccess 文件的信息推送到原始复制中 files 数组的末尾,而不是创建一个附加函数函数,首先检查它是否存在于源目录中:

if File.file?("#{src}/.htaccess")
    files.push("#{src}/.htaccess")
end

整个函数如下图:

def copy_to(dest, src, trim="")

    files = FileList.new()
    EXT_ALLOWED.each {|ext| files.include "#{src}/**/*.#{ext}"}
    if File.file?("#{src}/.htaccess")
        files.push("#{src}/.htaccess")
    end
    files.each do |file|
        dir = File.dirname(file)
        filename = File.basename(file)
        trimming = "/shared/" + trim + "(.*)"
        path = dir.match(trimming)
        if path == nil || dest == path[1] + '/'
            bin = dest
        else
            bin = File.join(dest, path[1] + '/')
        end
        puts "copying #{file} to #{bin}"
        FileUtils.mkdir_p(bin)
        FileUtils.cp file, bin
    end

end

请注意,我正在使用 .file? 来测试 .exists? 可以 return 目录真实性的实际文件。最后,您可以根据自己的情况使用任何一种方法。