我有一个Rails(3.1.3 with asset pipeline)应用程序,将作为战争部署。这个应用程序有ui“主题”。在内部,我只在Rails应用程序的assets目录中有.scss文件(Sass),我让用户在它们之间切换。
我想允许管理员在将应用程序部署为战争后将主题(基本上是.scss文件)添加到应用程序中。如何在不需要重建/重新编译战争的情况下允许功能(使用warbler)。理想情况下,他们可以添加主题,而无需对war文件做任何事情。
我对语言文件有类似的担忧。有人如何动态地将语言文件添加到已部署的Rails应用程序中?
我目前正在预编译资产,即使用Sass编写的主题,但是如果它有助于解决这个问题,我愿意改变它。我可以在战争之外预编译asssets吗?是否可以将资产管道的路径设置为战争之外?
答案 0 :(得分:1)
这就是我想到的。
你必须使用一些tomcat-apache-httpd combo
我的意思是预先编译文件,让apache提供静态内容,不要把它添加到战争中。
一旦您认为文件内容需要更改,再次预编译最新内容并将其替换为服务器。它不应该要求重新部署战争
您需要执行一些服务器配置来提供来自Apache的静态内容,并让其他调用转到tomcat。
预先将资产复制到公共资产目录并存储在其他位置并将apache配置为从该目录服务器/assets
服务器
检查如何配置mod_jk
以便从apache提供静态资产
http://tomcat.apache.org/connectors-doc/webserver_howto/apache.html 检查配置Apache以提供静态Web应用程序文件部分
使用proxypass
https://serverfault.com/questions/379667/apache-proxypass-ignore-static-files
https://www.apachelounge.com/viewtopic.php?t=3907
关于语言文件,如果它们位于资源之外,那么我认为@pito建议尝试使用某些数据库。
OR可以使用相同的缓存技术来缓存整个文件,方法是从其他服务器调用它,如果某个管理员需要更新文件,则重新加载文件缓存。
任何代码更改都需要重新编译war。
你可以在提取战争后直接在WEPAPPS提取的dir中添加文件更改文件并重新启动tomcat,但我认为这对于生产环境来说风险太大。
我还没有这样做,但我认为肯定应该有效。
答案 1 :(得分:1)
阅读Warbler似乎没有简单的解决方法,让应用程序通过数据库提供新的主题和语言
答案 2 :(得分:1)
免责声明:我根本不熟悉WAR。我的回答可能完全错误,因为我没有经验。请理解我发现这是一个有趣的挑战,我想找到一个解决方案。
我无法判断您何时创建WAR归档文件应用程序能够执行的操作。结果我决定使用命令行来进行实际编译。但是,如果需要,可以包含sass gem并直接使用编译器。
因为我依赖命令行,你必须安装sass gem。然后使用命令行界面查看README。
为了进行测试,我创建了一个名为Theme
的模型,其中包含以下列。您可能需要更改以下代码以匹配您现有的模型。
(string) title # the title of the theme
(string) stylesheet_file_name # the name of the file that is saved
在我的表单中,我使用了不同的字段名称来防止重叠。
<%= f.form_field :styleheet %>
然后在我的控制器内部添加了代码来编译上传的scss文件并将其移动到公共目录中。
def create
if params[:theme].has_key?(:stylesheet)
# create a filename friendly version of the theme name
file_name = params[:theme][:stylesheet_file_name] = params[:theme][:title].parameterize
# where to copy the temporary uploaded file to. It is important that we get
# the original extension. The `sass` command uses the extension to determine how to compile the file
tmp_file = "#{Rails.root}/tmp/#{params[:theme][:stylesheet].original_filename}"
# move from /tmp path to within the Rails temp directory
`cp #{params[:theme][:stylesheet].tempfile.path} #{tmp_file}`
# create the theme's css file.
File.open("#{Rails.root}/public/stylesheets/#{file_name}.css", 'w') do |f|
# compile the .scss file via command line
parsed_theme = `sass #{tmp_file}`
# store the contents of the file
f.write(parsed_theme)
end
# remove the temporary file we created earlier
`rm #{tmp_file}`
# this key wasn't part of my AR model
params[:theme].delete("stylesheet")
end
# rest of action here ...
end
准备好css文件后,您可以将其包含在layout/application.html.erb
文件中,包含以下内容。
<head>
<%= stylesheet_link_tag "/stylesheets/#{@current_theme.stylesheet_file_name}" %>
</head>