복붙노트

[RUBY-ON-RAILS] 응용 프로그램 / 자산의 모든 CSS와 JS 파일을 처리 할 수 ​​config.assets.precompile 설정을 레일

RUBY-ON-RAILS

응용 프로그램 / 자산의 모든 CSS와 JS 파일을 처리 할 수 ​​config.assets.precompile 설정을 레일

나는 내 프로젝트의 응용 프로그램 / 자산 폴더에있는 모든 CSS와 JS 파일을 사전 컴파일하고 싶습니다. 필요에 따라 I는 공급 업체 / 자산이나 lib 디렉토리 / 자산, 내 파일의 종속성에서 사전 컴파일 모든 싶지 않아요.

나는 다음과 같은 와일드 카드 설정을 시도했지만 잘못 모든 것을 사전 컴파일. 부트 스트랩-말대꾸를 사용하는 경우에도 추가 작업을 많이하고 이러한 결과는 컴파일 오류가 발생합니다.

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

전용 응용 프로그램 / 자산에서 내 파일을 처리하는 나의 가장 좋은 방법은 무엇입니까? 감사!

해결법

  1. ==============================

    1.config.assets.precompile = '*의 .js', '* .CSS']

    config.assets.precompile = '*의 .js', '* .CSS']

    즉 관계없이 디렉토리 깊이, 자산 경로에서 자바 스크립트 나 CSS를 컴파일합니다. 이 답변을 통해 발견.

  2. ==============================

    2.이 작업은 기본, 컴파일되지 않은 재원이가 위치하지 않는 논리 경로와 톱니의 작품이 포함되어 있다는 사실에 의해 더욱 어려워진다.

    이 작업은 기본, 컴파일되지 않은 재원이가 위치하지 않는 논리 경로와 톱니의 작품이 포함되어 있다는 사실에 의해 더욱 어려워진다.

    내 프로젝트는 JS 파일 "/app/assets/javascripts/foo/bar.js.coffee"을 가지고 가정하자.

    스프로킷 컴파일러는 첫째,이 경우 "의 .js"를 출력 파일 확장명을 결정하고 논리적 경로 "foo는 / bar.js"를 컴파일 할 것인지 여부를 평가한다. 컴파일되지 않은 자원이 "응용 프로그램 / 자산 / 자바 스크립트", "공급 업체 / 자산 / 자바 스크립트", "lib 디렉토리 / 자산 / 자바 스크립트"또는 보석에있을 수 있으므로 포함 할 수있는 방법이 없습니다 / 논리적 경로에 따라 특정 파일을 제외 혼자.

    기본 자원의 위치를 ​​확인하려면, 나는 논리적 경로 주어진 자원의 실제 경로를 해결하기 위해 (객체 Rails.application.assets를 통해 사용 가능) 톱니 환경을 요구하는 것이 필요하다 생각합니다.

    여기에 내가 사용하고있는 솔루션입니다. 이것이 가장 우아한 코드가 아닙니다, 그래서 나는 루비 상당히 새로운 오전 :

    # 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
    }
    

    톱니> 3.0,이 Rails.application.assets는 무기 호 (: config.assets.compile = 거짓 가정 기본값) 생산 작업을 할 것이다하지 않기 때문.

    당신과 함께 full_path 할당을 대체 해결하려면 :

    @assets ||= Rails.application.assets || Sprockets::Railtie.build_environment(Rails.application)
    full_path = @assets.resolve(path)
    

    참조 : https://github.com/rails/sprockets-rails/issues/237

  3. ==============================

    3.techpeace의 대답에 약간의 비틀기 :

    techpeace의 대답에 약간의 비틀기 :

    config.assets.precompile = '*의 .js', '* .CSS', '** / *. JS', '** / *. CSS']

    나는 그의 대답에 댓글을 추가 한 것입니다하지만 난 아직 충분히 명성을 필요가 없습니다. 나에게 upvote에를주고 내가 거기있을거야!

    참고 :이 또한 사전 컴파일 모든 CSS는 / 자바 스크립트 젬를 통해 포함됩니다.

  4. ==============================

    4.나는 레일 코드에서 이걸 발견 :

    나는 레일 코드에서 이걸 발견 :

    @assets.precompile               = [ Proc.new{ |path| !File.extname(path).in?(['.js', '.css']) },
                                         /(?:\/|\\|\A)application\.(css|js)$/ ]
    

    레일 가이드로 백업되는 :

    당신이 그것을 오버라이드 (override) 할 필요가 그래서 대신 + =의 = + = 사용하는 경우이 기본값은 재설정되지 않습니다. 분명히, 당신은 사전 컴파일뿐만 아니라 확장에 PROC 또는 정규 표현식을 전달할 수 있습니다, 그합니다. 당신은 최상위 디렉토리에있는 파일 만 preompile하려는 경우 나, 생각, 당신은 같은 정규식을 만들어야합니다 :

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

    5.나는 2017 년에이 기사를 재 방문하고있다.

    나는 2017 년에이 기사를 재 방문하고있다.

    우리의 제품은 여전히 ​​무겁게 우리는 지속적으로 우리는 새로운 모듈을 추가 할로 Rails.application.config.assets.precompile을 추가하여 우리의 사전 컴파일 구성을 수정 봤는데,의 RoR을 사용하고 있습니다. 최근에 내가 정규식 패턴을 추가하여 최적화하기 위해 노력했다, 나는 다음 글로브 패턴이 작동하는 것을 발견 :

    Rails.application.config.assets.precompile += %w(**/bundle/*.js)
    

    내가 글로브 대신 정규식 사용하도록 열심히 노력 있도록 그러나 나는 아직도, 특정 모듈을 제외 할 필요가있다.

    나는 톱니 소스 코드에 모습까지 : https://github.com/rails/sprockets-rails/blob/master/lib/sprockets/railtie.rb#L108, 나는 그들이 이미 정규식을 사용하고있는 것을 발견 :

    app.config.assets.precompile +=
      [LOOSE_APP_ASSETS, /(?:\/|\\|\A)application\.(css|js)$/]
    

    내 코드로 변경 그래서 :

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

    어느 잘 작동합니다.

  6. ==============================

    6.이 하위 디렉토리에있는 모든 파일을 포함하여 모든 .CSS의 .scss과의 .js을 얻을 것이다.

    이 하위 디렉토리에있는 모든 파일을 포함하여 모든 .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)
    
  7. ==============================

    7.나는 파셜 (밑줄에서 이름 시작 _)를 제외하고 모두 / 응용 프로그램 및 / 공급 업체 컴파일하는 모든 자산을 원했다. 그래서 여기 application.rb에있는 항목의 내 버전입니다 :

    나는 파셜 (밑줄에서 이름 시작 _)를 제외하고 모두 / 응용 프로그램 및 / 공급 업체 컴파일하는 모든 자산을 원했다. 그래서 여기 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
    }
    

    또한 그 파일을 출력리스트는 디버깅을 위해 컴파일되는 ...

  8. ==============================

    8.그들은 일부 파일하지 않는 한 (예를 들어, "_file.sass은"), 응용 프로그램 / 자산, 공급 업체 / 자산, lib 디렉토리 / 자산 :이 조각은 아래 보석을 제외한 모든 JS / CSS 파일이 포함되어 있습니다. 또한 모든 페이지에 포함되지 않은 보석에서 자산을 포함한 전략을 가지고있다.

    그들은 일부 파일하지 않는 한 (예를 들어, "_file.sass은"), 응용 프로그램 / 자산, 공급 업체 / 자산, lib 디렉토리 / 자산 :이 조각은 아래 보석을 제외한 모든 JS / CSS 파일이 포함되어 있습니다. 또한 모든 페이지에 포함되지 않은 보석에서 자산을 포함한 전략을 가지고있다.

        # 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
        }
    

    , 당신은 아마 가능성이 두 배 보석 자산을 사전 컴파일 될 거라고 때문에이 작업을 수행 할 수없는 것이지만 (이미 기본적으로 아무것도 \ = 당신의 application.js 또는 CSS에서 require'd). 그들은 일부 파일하지 않는 한 (예를 들어, "_file.sass은"), 응용 프로그램 / 자산, 공급 업체 / 자산, lib 디렉토리 / 자산 :이 조각은 아래 보석을 포함한 모든 JS / CSS 파일을 포함

    # This block includes all js/css files, including gems, 
    # under: app/assets, vendor/assets, lib/assets
    # and excluding 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
        asset_paths = %w( app/assets vendor/assets lib/assets)
        if (asset_paths.any? {|ap| full_path.include? ap}) && 
            !path.starts_with?('_')
          puts "\tIncluding: " + full_path
          true
        else
          puts "\tExcluding: " + full_path
          false
        end
      else
        false
      end
    }
    
  9. from https://stackoverflow.com/questions/10097993/rails-config-assets-precompile-setting-to-process-all-css-and-js-files-in-app-as by cc-by-sa and MIT license