gpt4 book ai didi

ruby-on-rails - Rails 3.1 Asset Pipeline无法预编译来自其他目录的文件

转载 作者:行者123 更新时间:2023-12-04 04:07:14 25 4
gpt4 key购买 nike

我目前有一个Rails 3.1应用程序,该应用程序为多个不同的客户托管多个站点。
每个站点都由一个模型表示,该模型知道域名和 Assets 存储位置以及其他一些信息。

我一直在使用app/sites/domain-name作为存储特定于给定站点的 Assets , View 和语言环境的位置,并且正在运行自定义中间件和 Controller 操作以修改Sprocket的加载路径,设置 View 路径等。

中间件(使用config.middleware.use "Configurator"中的application.rb加载):

class Configurator
def initialize(app)
@app = app
end

def call(env)
@env = env
clear_existing_paths
prepend_local_assets
@app.call(env)
end

def current_site
# find site using @env
end

def current_site_path
Rails.root.join('app', 'sites', current_site.path)
end

def clear_existing_paths
paths = Rails.application.assets.paths
Rails.application.assets.clear_paths
paths.each do |path|
next if path.include?("app/sites/")
Rails.application.assets.append_path path
end
end

def prepend_local_assets
path = current_site_path.join('assets')
return unless Dir.exists?(path)

['images', 'javascripts', 'misc', 'stylesheets'].each do |subdir|
asset_dir = path.join(subdir).to_s
next unless Dir.exists?(asset_dir)
next if Rails.application.assets.paths.include? asset_dir

Rails.application.assets.prepend_path asset_dir
end
end
end
application.rb中的 Assets 位:
module MyApp
class Application < Rails::Application
...
config.middleware.use "Configurator"

config.assets.enabled = true
config.assets.version = '1.0'
end
end

environments/production.rb:
MyApp::Application.configure do
config.serve_static_assets = false
config.assets.compress = true
config.assets.compile = true
config.assets.digest = true
# Defaults to Rails.root.join("public/assets")
# config.assets.manifest = YOUR_PATH
end

问题在于,尽管此设置有效,但它阻止了我对未与整个应用共享的 Assets 进行预编译,从而从外观上一遍又一遍地生成它们。

我有什么办法可以告诉预编译器找到位于此处的 Assets ,并为它们创建一个版本?每个站点都有一个 site.css.scsssite.js.coffee文件,这些文件可能需要site-dir中的其他 Assets 。如果可以将其预编译为 public/assets/domain-name/site.(js|css),那就太好了,这样当我需要进一步优化时,可以轻松地为 Assets 设置一个单独的子域。

最终解决方案(2012-02-22)

在实现了Brian的建议之后,我最终得到了

存储在 app/sites/<sitename>/assets/<shortname>/site.css|js中的主要样式表/javascript,其中 sitename是此站点的域,而 shortname是域的主要部分,没有子域或com | org | net | ccTLD。

修改了所有 View 和样式表,以将 shortname附加到我的 Assets 路径中。

config/application.rb中:
{ "sitename" => "shortname", ... }.each_pair do |domain, short|
%w{stylesheets javascripts}.each do |dir|
config.assets.paths << Rails.root.join("app/sites/#{domain}/assets/#{dir}").to_s
end # Had to specify each dir to make it work
config.assets.precompile += ["#{short}/site.css", "#{short}/site.js"]
end

在运行 rake assets:precompile时,这将创建 public/assets/shortname,其中填充了该站点的所有 Assets ,并且 public/assets也具有所有共享 Assets 。非常适合我的需求。

由于所有内容都以 public/assets结尾,因此我能够删除 Configurator -middleware,因为默认配置能够找到所有 Assets

最佳答案

我认为问题在于,通过将每个站点添加为路径,链轮只能找到第一个站点。

我已经使用指南针进行了尝试,但是对于普通链轮来说应该是相同的。
我没有尝试使用您的配置器方法,但是看起来很容易使我的配置适应该方法。

您可以将您的app/sites/*更改为更标准的文件格式吗?

./app/assets/javascripts/application.js
./app/assets/stylesheets/screen.css.scss
./app/assets/stylesheets/othersite/screen.css.scss

更改您的config/application.rb,然后添加每个站点。
这将在每个主机上预生成所有样式:
config.assets.precompile += ['screen.css', 'othersite/screen.css']

在 View /布局/应用程序中,您需要配置站点名称的路径:
= stylesheet_link_tag '[your sitename here]/screen'

在我完成 Assets :清理和预编译之后,我在公开场合看到了这一点:
./assets/othersite/screen.css
./assets/othersite/screen.css.gz
./assets/screen.css
./assets/screen.css.gz

关于ruby-on-rails - Rails 3.1 Asset Pipeline无法预编译来自其他目录的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9260989/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com