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

时间:2015-11-02 18:18:24

标签: ruby rake

我正在使用Rake创建一些构建脚本,这些脚本将用作通过Docker容器将我们的Web服务部署到云的整个过程的一部分。为了实现这一目标,我们将使用Rake的几个repos的资源组合到"汇编"目录/文件布局。这一切都很好,除了一个项目.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/结尾,我可以在此功能中进行此操作吗?或者我是否需要专门为以点开头的文件名写一些东西?

1 个答案:

答案 0 :(得分:2)

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

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? 可以返回目录真实性的实际文件。最后,根据您的具体情况,您可以使用任何一种方法。