Git submoduleで別プロジェクトのassetsを使いまわす

More than 3 years have passed since last update.

あ、どうも。


経緯

とあるプロジェクトで、別のプロジェクトで使っていた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を追加するだけだ。


config/application.rb

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みたいにさ!!