Rails Engine에서 Sprockets와 Propshaft를 모두 지원하기 위한 핵심 작업은 engine.rb
파일 내에서 이루어집니다. 이 파일은 Rails Engine이 메인 애플리케이션에 연결되는 진입점 역할을 합니다.
먼저, 자산 번들링을 위해 cssbundling-rails
및 jsbundling-rails
젬을 사용합니다. 이 젬들을 통해 번들링된 CSS 및 JS 파일은 app/assets/builds
디렉토리에 저장되며, 이 디렉토리의 모든 자산은 Sprockets와 Propshaft 모두에 자동으로 노출됩니다. 이는 가장 기본적인 자산 노출 방식입니다.
그러나 app/assets/builds
디렉토리 외부에 위치한 자산, 예를 들어 개발 편의성을 위해 별도 디렉토리에 보관되는 이미지, SVG 파일 등은 명시적인 노출 과정이 필요합니다. 이를 위해 engine.rb
파일 내에서 initializer
콜백을 생성하고, app.config.assets.paths
에 Engine.root.join("app", "assets", "images").to_s
와 같이 이미지 및 SVG 디렉토리를 추가해야 합니다. 이렇게 설정하면 image_tag '엔진명/로고.png'
와 같은 헬퍼가 Sprockets와 Propshaft 환경 모두에서 정상적으로 작동하게 됩니다.
CSS 파일 내에서 url()
함수를 통해 자산을 참조하는 경우에도 차이가 발생합니다. Propshaft는 app.config.assets.paths
설정만으로도 스마트하게 해당 자산을 찾아 처리하며, 심지어 접두사 없이 url('로고.png')
처럼 사용해도 작동합니다(단, 충돌 방지를 위해 엔진명 접두사 사용 권장). 반면 Sprockets는 자산에 접근하기 위해 명시적인 사전 컴파일 경로 설정이 필요합니다.
Sprockets에서 자산을 노출하는 방법은 두 가지가 있습니다:
-
app.config.assets.precompile
배열 사용:engine.rb
파일 내에서app.config.assets.precompile += %w[ 엔진명/로고.png ]
와 같이 개별 파일을 배열에 추가하거나, 보다 프로그램적인 방식으로 지정된 디렉토리 내의 모든 파일을 찾아서 상대 경로로 추가할 수 있습니다. Sprockets는 자산의 상대 경로를 요구하므로,app/assets/images/엔진명/로고.png
와 같은 전체 경로가 아닌엔진명/로고.png
형태로 제공해야 합니다. 이는 문서화되지 않은 중요한 부분입니다. -
manifest.js
파일 사용:app/assets/config
디렉토리에엔진명_manifest.js
파일을 생성하고, 이 파일 내에서//= link_tree ../builds
,//= link_tree ../images
와 같이link_tree
지시어를 사용하여 자산 디렉토리를 연결합니다. 이후engine.rb
에서 Sprockets가 이 매니페스트 파일을 사전 컴파일하도록app.config.assets.precompile += %w[엔진명_manifest.js]
를 추가합니다. 이 방법은 Sprockets의 전통적인 자산 관리 방식과 유사합니다.
마지막으로, 모범 사례로서 최종(번들링된) 자산 및 이미지, SVG 파일 등의 디렉토리에 엔진 이름을 네임스페이스로 부여하는 것을 권장합니다. 예를 들어, app/assets/builds/ENGINE_NAME
, app/assets/images/ENGINE_NAME
와 같이 구성하여 다른 애플리케이션의 자산과의 충돌을 방지하고 명확성을 높일 수 있습니다.