2011-11-04 6 views
28

Rails 3.1에서는 애셋 사전 컴파일에 포함시키려는 파일을 허용 목록에 추가해야합니다. 당신은 설정/환경/production.rb를 열고 명시 적으로 미리 컴파일 할 자산을 포함해야합니다config.assets.precompile의 목적은 무엇입니까?

config.assets.precompile += ['somestylesheet.css']

이이 작업을 수행하지 않고 당신이 레이크 자산을 실행하는 경우 : 사전 컴파일, 당신의 자산은하지 않습니다 public/assets에 복사하고 자산을 찾을 수없는 경우 앱에서 예외가 발생하여 프로덕션에서 500 오류가 발생합니다.

왜 이것이 필요합니까? 이유가 무엇입니까 모두 에셋이 자동으로 미리 컴파일됩니까?

이 방법은 배포시 추가 코드와 스트레스를 생성합니다. 일을 즉시 처리 할 수 ​​있도록 자산을 블랙리스트/제외하는 것이 더 쉬울까요? 누구나이 감정을 공유합니까?

+1

명확히하기 위해 ** 명시 적으로 ** 자산을 지정해야 할 필요성에 대해 비판했습니다. 레일 사전 처리 프로세스는 코드를 컴파일하는 것뿐만 아니라 컴파일 된 자산 코드를 웹 서버의 공개 디렉토리에 복사합니다. 애셋이 컴파일을 필요로하지 않더라도 (일반 '.js' 파일과 같이) 앱에'사전 컴파일 '을해야하므로'public/assets'에 복사됩니다. 이 작업을 수행하지 않으면 자산을 필요로하는 페이지에서 예외가 발생합니다. – dhulihan

+1

파일을 결합하고 축소하는 관례 인 경우 모든 자산을 사전 컴파일하지 않으려 고합니다. 이 기법은 개별적으로 포함 할 자산을 대상으로합니다. 예를 들어, application.js에서 미리 컴파일 할 필요가없는 다른 많은 JS 파일을 // require 할 수 있습니다. –

+0

@ Simon Peck : 맞습니다. 일부 자산은 미리 컴파일 할 필요가 없지만 명시 적으로 포함되지 않으면 최종 자산 위치 (예 :'public/assets')로 복사되지 않습니다. 요청시 찾을 수 없습니다. '// = require'를 사용하여'application.js '에 애셋을 추가해도 작동하지만 대역폭 오버 헤드가 추가되고 사이트 전체에서 사용되지 않는 애셋에는 적합하지 않습니다. – dhulihan

답변

2

나에게 사전 컴파일 된 자산이 멋지므로 원하지 않는 자산을 배치하지 않아도됩니다. 또한 자바 스크립트를 압축하는 데 도움이되는 uglifer gem을 잊지 마세요. 이미징은 이미 존재하지 않으며 앱을 배포하면 사용되지 않은 CSS 파일과 압축되지 않은 자바 스크립트가 있음을 알게됩니다. 기분 어때? 이것은 내 자신의 의견이며 자산 파이프 라인은 레일에서 가장 멋진 것입니다. 모든 자산을 적절하게 관리 할 수 ​​있어야합니다. 내가 레일을 생각하면

그리고 마음 당신은 내가 당신이 그래서 당신은이 사람이 이러한 자산을 컴파일 않은 이유 당신의 마음에 말을 싶지 않을 것이다 자산을 컴파일하고 싶지 않아요 .. :)

+0

좋은 지적, 의견에 감사드립니다. 저작물이 애플리케이션에서 전혀 사용되지 않으면 파일 구조의 일부가되어서는 안됩니다. 원치 않는 자산이 다른 바람직한 비 자산 기능을 가진 타사 보석의 일부가 아니라면 – dhulihan

+4

뭔가 명시 적으로 컴파일되지 않았기 때문에 사용자가 페이지 500을 보는 것보다 사용하지 않은 자산이 더 있습니다. – Gunchars

19

대부분의 자산 입니다 자산 사전 컴파일에 자동으로 포함됩니다. RoR Guide on the Asset Pipeline에 따르면

파일을 컴파일의 기본 정규 표현이로 끝나지 않는 application.js, application.css 모든 파일을 포함 JS 또는 CSS는 다음과 같은 경우 [ /\w+\.(?!js|css).+/, /application.(css|js)$/ ]

당신은 config.assets.precompile을 사용 포함 할 추가 자산을 가지고

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

또는 덮어 쓸 수 있습니다.

+1

여기의 키워드는 * most *입니다. 앱 구성에'admin.js'와 같은 여분의 임의의 애셋을 명시 적으로 추가해야하거나 일부 페이지에서 예외가 발생할 수 있습니다. 나는이 여분의 단계가 필요하지 않을 수도 있다고 논쟁 중이다. – dhulihan

8

나는 그것이 파이프 라인/스프로킷과 별도의 파일을 요구하는 능력과 관련이 있다고 생각한다.

예를 들어, 내 app/assets/javascripts 폴더에 admin.js 파일이 있습니다. 그러나 모든 작업에는 몇 가지 다른 .js 파일이 필요합니다. (A) I 외부 JS 플러그인을 사용하고 있습니다와 (b) I는 별도의 파일에의 jQuery 온로드 핸들러 같은 것들을 계속 좋아하기 때문에

//= require jquery 
//= require jquery_ujs 
//= require jquery.colorpicker.js 
//= require jquery.wysiwyg.js 
//= require wysiwyg.image.js 
//= require jquery.fileupload.js 
//= require jquery.fileupload-ui.js 
//= require codemirror.js 
//= require css.js 
//= require admin_load 

이입니다.

모든의 .js 파일을 미리 컴파일 된 경우, 다음이 개별 파일-완전히 불필요 하나 하나를 미리 컴파일합니다. 원하는/admin.js 파일을 미리 컴파일해야합니다.

같은 내용은 CSS 파일에 적용됩니다.

+4

사실, 어떤 종류의 컴파일 (예 : 일반 .js 파일)도 필요하지 않은 애셋이 있으며, 여러분이 말했듯이 컴파일해서는 안됩니다. 그러나이 애셋을 스프로킷 매니페스트가 아닌 다른 곳에서 사용하는 경우 (예 :보기에서 'javascript_include_tag'admin.js '를 사용) 앱의 config에이 임의의 애셋을 명시 적으로 포함시키지 않았 으면 public/assets'에 복사되고 페이지는 프로덕션에서 예외를 발생시킵니다. – dhulihan

관련 문제