我正在使用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/
结尾,我可以在此功能中进行此操作吗?或者我是否需要专门为以点开头的文件名写一些东西?
答案 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?
可以返回目录真实性的实际文件。最后,根据您的具体情况,您可以使用任何一种方法。