Rails4가 Gemfile에서 "assets"그룹에 대한 지원을 중단 한 이유


99

Rails 3에서는 자산 파이프 라인에서 자산을 생성하기 위해 독점적으로 사용 된 gem assets이 Gemfile 그룹에 올바르게 배치되었습니다 .

...

# Gems used only for assets and not required
# in production environments by default.
group :assets do
  gem 'sass-rails'
  gem 'coffee-rails'
  gem 'uglifier'

  # See https://github.com/sstephenson/execjs#readme for more supported runtimes
  # gem 'therubyracer', :platforms => :ruby
end

이제 (아직 진행중인) 업그레이드 문서 에 따르면 :

Rails 4.0은 Gemfile에서 자산 그룹을 제거했습니다. 업그레이드 할 때 Gemfile에서 해당 줄을 제거해야합니다.

물론 RC1로 새 프로젝트를 만들면 모든 그룹 외부에 기본적으로 포함 된 자산 관련 gem이있는 Gemfile이 생성됩니다.

source 'https://rubygems.org'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.0.0.rc1'

# Use sqlite3 as the database for Active Record
gem 'sqlite3'

# Use SCSS for stylesheets
gem 'sass-rails', '~> 4.0.0.rc1'

# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'

# Use CoffeeScript for .js.coffee assets and views
gem 'coffee-rails', '~> 4.0.0'

# See https://github.com/sstephenson/execjs#readme for more supported runtimes
# gem 'therubyracer', platforms: :ruby

...

이것은 이러한 gem이 이제 기본적으로 프로덕션 빌드에 번들됨을 의미합니까? 그렇다면 왜 마음이 바뀌 었습니까? Rails 4는 프로덕션에서 동적 자산 생성으로 이동하고 있습니까?


1
나는 여전히 "자산 그룹"의 목적이 무엇인지, 그리고 자산 그룹을 불필요하게 만든 Rails 4에서 무엇이 변경되었는지 알 수 없습니다.
Michiel de Mare

23
"자산 그룹"은 사람마다 다른 것입니다. 프로덕션에서 번들로 필요하지 않은 보석을 넣는 장소로 사용했습니다. 그러나 받아 들여진 답변에 연결된 대화를 살펴보면, 최소한 Rails core의 일부 사람들은 사전 컴파일되지 않은 자산이 프로덕션에서 404로 실패했는지 확인하는 방법으로이를 사용했습니다. 공연). 변경된 점은 rails4가 더 이상 자산을 자동 생성하지 않기 때문에 "자산 그룹"해결 방법 (rails core에서 보았 듯이)이 제거되었습니다.
jemmons

그것은 아직 가장 명확한 설명입니다. 답변에 넣으면 현상금은 귀하의 것입니다.
Michiel de Mare

@MichieldeMare 나는 내 자신의 질문에 대한 현상금을받는 것이 이상하다고 느낄 것입니다 ;-) 만약 당신이 그것을 원한다면, 그가 나를 이해하는 데 도움이 되었기 때문에 당신은 Filipe Giusti에게 현상금을 줄 수 있습니다.
jemmons

3
미래의 사람들에게 경고 : Rails 업그레이드 가이드를 무시하고 자산 그룹을 Gemfile에 유지하기로 선택한 경우, Rails가 프로덕션에서 자산을 컴파일 할 때 더 이상 자산 그룹을 자동으로 요구하지 않는다는 점을 명심하십시오. 직접 수행하거나 빌드 환경에서 프로덕션의 자산을 사전 컴파일하려면 명령 앞에 추가 RAILS_GROUPS=assets(참조 Rails.groups)해야합니다.
Ajedi32

답변:


100

이전에는 프로덕션에서 의도하지 않은 주문형 컴파일을 방지하기 위해 자산 그룹이 존재했습니다. Rails 4는 더 이상 그렇게 작동하지 않으므로 자산 그룹을 제거하는 것이 합리적이었습니다.

이것은 그것을 변경 한 커밋 에서 더 자세히 설명됩니다 . 실제 답변으로 인용문을 추출했습니다.

커피 템플릿을 사용하는 경우 커피 레일과 같은 일부 보석이 필요할 수 있습니다 (프로덕션에서 더 이상 요청시 자산이 사전 컴파일되지 않는다는 사실).

(프로덕션에서 사전 컴파일되지 않음) 3.2.x의 프로덕션 환경에 해당 gem이 있고 사전 컴파일하는 것을 잊은 경우 Rails가 개발에서 수행하는 작업을 정확히 수행하고 요청 된 자산을 사전 컴파일합니다. 이것은 Rails 4에서 더 이상 사실이 아니므로 작업을 사용하여 자산을 사전 컴파일하지 않으면 자산이 요청 일 때 404가 표시됩니다.


32
메모리도 절약하지 않았나요? 이제 "프로덕션"(프리 컴파일에서만)에 필요하지 않은 모든 gem이로드되어 레일이 더 많은 메모리를 소비합니까?
gucki

3
+1 @gucki 및로드 시간. 이것은 그룹에 대한 나의 이해였습니다. 어쨌든 라이브 컴파일을 비활성화하는 설정 옵션이 이미 있기 때문에. 여기서 "지원"은 무엇입니까? afaik 내 Rails 3 앱에는 개발 단계에서 자산을로드하는 env / prod.rb 줄이 있습니다. 그게 다라면 그냥 추가해도 될까요?
Karthik T

자산 그룹이 제거됩니다. 이전에 자산 내부의 보석이 프로덕션에로드되었지만 이제 프로덕션에서도 필요하면 어떨까요? 따라서 프로덕션에로드되어야하며 자산 그룹을 제거하면이를 보장합니다. 자산은 프로덕션으로 이동하기 전에 미리 컴파일해야합니다.
prashantsahni

13

Rails 4는 배포 전에 자산을 미리 컴파일하도록 강제합니다. 자산을 미리 컴파일해야합니다.

$ RAILS_ENV=production bundle exec rake assets:precompile

그리고 왜? 가이드에서 찾았습니다.

기본적으로 Rails는 자산이 사전 컴파일되어 웹 서버에 의해 정적 자산으로 제공된다고 가정합니다.

(출처 : http://edgeguides.rubyonrails.org/asset_pipeline.html#in-production )

하지만 프로덕션에서 이러한 'assets'gem을 사용해야하는 경우가 많습니다. 예를 들어 뷰 디렉토리에서 js.coffee 파일을 사용하는 경우 Rails는 프로덕션 모드에서도 커피 컴파일러가 필요합니다.

그래서이 변경의 이유는 성능 향상 때문이라고 생각합니다. :)


22
자산이 사전 컴파일되었다고 가정하는 Rails 는 그룹을 제거하는 것이 아니라 그룹 을 유지 하기 위한 논쟁입니다 assets(자산이 사전 컴파일 된 경우 이러한 gem은 프로덕션에 필요하지 않으며 번 들러에 포함되어서는 안됩니다). 그리고 예, 아마도 coffee-rails프로덕션에서 와 같은 보석을 사용할 것입니다 ...하지만 Rails 3에서도 마찬가지였습니다. 그리고 3 넣어 레일 coffee-rails에서 assets기본적으로 그룹. 그렇다면 Rails 4가 변경된 이유는 무엇입니까?
jemmons

1
뷰 디렉토리에서 js.coffee 파일을 사용하는 이유는 무엇입니까? 자산 / 자바 스크립트에 있어야합니다.
Marnen Laibow-Koser 2014 년

3

AJAX ( history )로 coffeescript를 원 하므로 coffee-rails자산 그룹에서 벗어납니다.
sass-rails오작동 ( history )이므로 자산 그룹에서 이동합니다.

자산 그룹을 조정하십시오.


2
CoffeeScript는 뷰에 있어서는 안됩니다. 그것 없이도 Ajax를 할 수 있습니다. Ajax를 수행하기 위해 동적으로 JS를 생성 할 필요는 없습니다. 사실, JS를 동적으로 생성해서는 안됩니다. CoffeeScript 파일을 미리 컴파일하고 문제를 완전히 피하십시오.
Marnen Laibow-Koser 2014 년

1
sass-rails Bundler.require :assets가 실행되지 않기 때문에 오작동 합니다. 이는 자산 그룹을 제거하는 이유가 아닙니다. 나는 therubyracer, libv8 et c를 원하지 않습니다. 제작 과정에서 왜 누가 그렇게합니까? Coffee 템플릿은 JS 템플릿으로 컴파일 할 수 있으며 새 값이 대체 될 때마다 컴파일 할 필요가 없습니다. 이 모든 부담을 생산에 맡길 필요는 없습니다.
phil pirozhkov 2014 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.