2015-11-02 38 views
0

我在创造一些构建脚本,用耙​​的过程中,将用作经Docker容器云部署我们的Web服务的整个过程的一部分。为了实现这个目标,我们使用Rake将来自多个Repos的资源组合起来,以“组合”目录/文件布局。这一切都很好,除了一个项目,.htaccess文件。如何使用Rake复制.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/结束了,我可以让这个函数内发生的呢?还是我需要专门为文件名开头写点东西?

回答

2

在这种情况下,寻找一个快速和肮脏的(!是的......我觉得脏做这种方式)的选项,我写了一个函数,在一个特定的目录将专门查找了.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?可以返回目录的真实性。最后,您可以根据您的情况使用任意一种方法。