2015-11-02 55 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?可以返回目錄的真實性。最後,您可以根據您的情況使用任意一種方法。