12
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

あ、どうも。

経緯

とあるプロジェクトで、別のプロジェクトで使っていた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みたいにさ!!

12
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?