あ、どうも。
経緯
とあるプロジェクトで、別のプロジェクトで使っていたSassのファイルと画像ファイルを使いまわせないか、という話が持ち上がった。
やり方はいくつかありそうだけど、ここはあえて勉強も兼ねて、git submodule
を使ってみよう、ということになった。
ちなみにいくつかの他の案は以下のとおりだ。
- そもそも使いまわさない
- コピペ
使いまわしたいと言っているのに使いまわさないとかトンチが効いてるし、コピペは死ねと思ってるので、やっぱり最初から解決策は一つしか無かったらしい。無念。
git submodule add
まず、自分がいるリポジトリのRailsアプリのどこにsubmoduleを突っ込むのかを考えた。
多分vendorだな、ということで、以下のようなファイル構成にしてみた。
/vendor/assets/other_product
早速submoduleを追加しよう。
$ git submodule add git@github.com:hoge/other_product.git vendor/assets/other_product
すると、良く分からないファイルが生成されるはずだ。
- vendor/assets/other_product
- .gitmodule
これらはsubmoduleに関する情報を持っていて、vendor/assets/other_product
の方はaddした別リポジトリへの参照になっている。
そして.gitmodule
の方には、追加したsubmoduleに関する情報(具体的にはリモートリポジトリはどこなのかとか、リポジトリ名とか、現在のリポジトリの何処に配置したかとか)が書いてある。
Railsに読み込ませる
実はここまででもうほぼ終わっている。後はAsset Pipelineのpathsにsubmoduleの中のassetsを追加するだけだ。
module Product
class Application < Rails::Application
...
...
%w(images stylesheets).each do |dir|
config.assets.paths << Rails.root.join("vendor/assets/other_product/app/assets/#{dir}")
config.assets.paths << Rails.root.join("vendor/assets/other_product/vendor/assets/#{dir}")
end
end
end
だいたいこんな感じ。
まとめ
異なるリポジトリ間で何かを共有したかったりする時に、上位存在を作ってそいつをsubmoduleで読み込んでやるのはある意味得策かもしれないなぁ、とか思った。
でも一番いいのはgemにすることだと思うんだよね!!bootstrap-sass
みたいにさ!!