Ruby on rails Rails config.assets.precompile设置以处理app/assets中的所有CSS和JS文件

Ruby on rails Rails config.assets.precompile设置以处理app/assets中的所有CSS和JS文件,ruby-on-rails,ruby-on-rails-3,sprockets,Ruby On Rails,Ruby On Rails 3,Sprockets,我希望预编译项目的app/assets文件夹中的所有CSS和JS文件。我不想预编译vendor/assets或lib/assets中的所有内容,只想根据需要预编译文件的依赖项 我尝试了以下通配符设置,但它错误地预编译了所有内容。这会导致大量额外工作,甚至在使用引导sass时导致编译失败 config.assets.precompile += ['*.js', '*.css'] 我最好只在app/assets中处理文件的方法是什么?谢谢 我在rails代码中发现: @assets.precomp

我希望预编译项目的
app/assets
文件夹中的所有CSS和JS文件。我不想预编译vendor/assets或lib/assets中的所有内容,只想根据需要预编译文件的依赖项

我尝试了以下通配符设置,但它错误地预编译了所有内容。这会导致大量额外工作,甚至在使用引导sass时导致编译失败

config.assets.precompile += ['*.js', '*.css']

我最好只在
app/assets
中处理文件的方法是什么?谢谢

我在rails代码中发现:

@assets.precompile               = [ Proc.new{ |path| !File.extname(path).in?(['.js', '.css']) },
                                     /(?:\/|\\|\A)application\.(css|js)$/ ]
使用导轨进行备份:

编译文件的默认匹配器包括application.js, application.css和所有非JS/css文件

如果使用
+=
,则不会重置此默认值,因此需要使用
=
而不是
+=
来覆盖它。请注意,显然,您可以将Proc或regex传递给
预编译
以及扩展。我相信,如果您只想预编译顶级目录中的文件,则必须创建一个正则表达式,如:

config.assets.precompile = [ /\A[^\/\\]+\.(ccs|js)$/i ]

由于链轮与不包括底层未编译资源所在位置的逻辑路径一起工作,因此此任务变得更加困难

假设我的项目有JS文件“/app/assets/javascripts/foo/bar.JS.coffee”

链轮编译器将首先确定输出文件扩展名,在本例中为“.js”,然后评估是否编译逻辑路径“foo/bar.js”。未编译的资源可能位于“app/assets/javascripts”、“vendor/assets/javascripts”、“lib/assets/javascripts”或gem中,因此无法仅基于逻辑路径包含/排除特定文件

为了确定底层资源的位置,我认为有必要要求Sprocket环境(通过object Rails.application.assets提供)解析给定逻辑路径的资源的实际路径

这是我正在使用的解决方案。我对Ruby相当陌生,因此这不是最优雅的代码:

# In production.rb
config.assets.precompile << Proc.new { |path|
  if path =~ /\.(css|js)\z/
    full_path = Rails.application.assets.resolve(path).to_path
    app_assets_path = Rails.root.join('app', 'assets').to_path
    if full_path.starts_with? app_assets_path
      puts "including asset: " + full_path
      true
    else
      puts "excluding asset: " + full_path
      false
    end
  else
    false
  end
}

另请参见:

config.assets.precompile=['*.js','*.css']


这将编译资产路径中的任何JavaScript或CSS,而不考虑目录深度。通过找到。

我希望编译/app和/vendor中的所有资产,除了partials(名称以下划线开头)。下面是application.rb中条目的我的版本:

config.assets.precompile << Proc.new { |path|
  if path =~ /\.(css|js)\z/
    full_path = Rails.application.assets.resolve(path).to_path
    app_assets_path = Rails.root.join('app', 'assets').to_path
    vendor_assets_path = Rails.root.join('vendor', 'assets').to_path

    if ((full_path.starts_with? app_assets_path) || (full_path.starts_with? vendor_assets_path)) && (!path.starts_with? '_')
      puts "\t" + full_path.slice(Rails.root.to_path.size..-1)
      true
    else
      false
    end
  else
    false
  end
}

config.assets.precompile对techpeace的答案稍加修改:


config.assets.precompile=['*.js'、'*.css'、'***/*.js'、'***/*.css']

我本想在他的回答中加上一句话,但我的名声还不够好。给我一票,我就在那儿


注意:这还将预编译通过rubygems包含的所有CSS/JavaScript。

此代码段包括所有js/CSS文件,不包括gems,位于:app/assets,供应商/assetslib/assets,除非它们是部分文件(例如“\u file.sass”)。它还有一个策略,可以包含Gems中的资产,而这些资产并不包含在每个页面中

    # These assets are from Gems which aren't included in every page.
    # So they must be included here
    # instead of in the application.js and css manifests.
    config.assets.precompile += %w(a-gem.css a-gem.js b-gem.js)

    # This block includes all js/css files, excluding gems,
    # under: app/assets, vendor/assets, lib/assets
    # unless they are partial files (e.g. "_file.sass")
    config.assets.precompile << Proc.new { |path|
      if path =~ /\.(css|js)\z/
        full_path = Rails.application.assets.resolve(path).to_path
        aps = %w( /app/assets /vendor/assets /lib/assets )
        if aps.any? {|ap| full_path.starts_with?("#{Rails.root}#{ap}")} &&
            !path.starts_with?('_')
          puts "\tIncluding: " + full_path.slice(Rails.root.to_path.size..-1)
          true
        else
          puts "\tExcluding: " + full_path
          false
        end
      else
        false
      end
    }
#这些资产来自Gems,并非每页都包含。
#所以他们必须包括在这里
#而不是在application.js和css清单中。
config.assets.precompile+=%w(a-gem.css a-gem.js b-gem.js)
#此块包括所有js/css文件,不包括gems,
#下:应用程序/资产、供应商/资产、库/资产
#除非它们是部分文件(例如“_file.sass”)

config.assets.precompile这将获得所有
.css
.scss
.js
,包括子目录中的所有文件

js_prefix    = 'app/assets/javascripts/'
style_prefix = 'app/assets/stylesheets/'

javascripts = Dir["#{js_prefix}**/*.js"].map      { |x| x.gsub(js_prefix,    '') }
css         = Dir["#{style_prefix}**/*.css"].map  { |x| x.gsub(style_prefix, '') }
scss        = Dir["#{style_prefix}**/*.scss"].map { |x| x.gsub(style_prefix, '') }

Rails.application.config.assets.precompile = (javascripts + css + scss)

我将在2017年重温这篇文章

我们的产品仍然大量使用RoR,我们一直在不断修改预编译配置,在添加新模块时添加
Rails.application.config.assets.precompile
。最近,我试图通过添加一个regex模式来优化它,我发现以下glob模式可以工作:

Rails.application.config.assets.precompile += %w(**/bundle/*.js)
然而,我仍然需要排除某些模块,所以我努力使用regex而不是glob

在查看链轮源代码之前,我发现它们已经在使用正则表达式:

app.config.assets.precompile +=
  [LOOSE_APP_ASSETS, /(?:\/|\\|\A)application\.(css|js)$/]
因此,我将代码更改为:

Rails.application.config.assets.precompile +=
  [/^((?!my_excluded_module)\w)*\/bundle\/\w*\.js$/]

这很有效

迈克尔:我感谢你的回答,这让我找到了正确的答案。我想预编译app/assets树中的每个css/js文件,而不仅仅是在顶级目录中。不幸的是,传递到proc的路径是一个逻辑路径,不能区分app/资产、vendor/资产、lib/资产等,因此需要进行更多的挖掘。关于所使用的解决方案,请参阅我的答案。现在我了解了如何在
Rails.application.config.assets.precompile
行中使用正则表达式。我在网上搜索了一个小时才明白这一点。其他地方没有记录。谢谢。在花了几天时间尝试各种可能的解决方案之后,这是唯一对我有效的方法。它甚至适用于
datejsrails
bootstrap sass
gems(这会导致其他解决方案出现各种问题)。不,它不会进入一个很深的文件夹。您必须使用['your\u internal\u directory\u name/*.js']来编译内部文件它只是
=
+=
?抱歉,以前没有看到这个。你可以用任何一种。如果要添加到当前选项,将使用+=。如果要替换选项,则只需使用=。您并不总是希望这样,因为如果使用SCS,子文件夹通常会导入。仅根级别通常就足够了。如果您对通过Regex将资产列入黑名单感兴趣,请参阅此处:从Rails 4(或更早版本)开始,proc的第二个参数是
full\u path
。例如,
Proc.new{| logical|u path,full|u path
这是最优雅的,尽管我使用了+=而不是just=
app.config.assets.precompile +=
  [LOOSE_APP_ASSETS, /(?:\/|\\|\A)application\.(css|js)$/]
Rails.application.config.assets.precompile +=
  [/^((?!my_excluded_module)\w)*\/bundle\/\w*\.js$/]