[Middleman 3] Middleman: Bower をつかってみる
なんとなく整理ができたので、リライトしてまとめておきます。
(2014/10/06)
[markdown]
“`prettyprinted
% middleman version
Middleman 3.3.6
“`
> * [Middleman: Asset Pipeline | deadwood](https://www.d-wood.com/blog/2014/10/14_7026.html)
## Bower
### インストール
Bower がインストールされていなければ、下記でインストールします。
“`prettyprinted
% npm install -g bower
“`
npm も必要な場合は下記あたりで。
> * [Node.js: Homebrew で node.js をインストールする | deadwood](https://www.d-wood.com/blog/2014/03/21_5852.html)
> * [Node.js: nodebrew で node.js をインストールする | deadwood](https://www.d-wood.com/blog/2013/10/30_4963.html)
次にこのプロジェクトで Bower を使うよと init します。
bower.json というファイルが作成されます。
“`prettyprinted
% bower init
“`
いろいろ聞かれますが、利用するだけならすべてリターン&イエスで進めて大丈夫です。
bower.json まわりの内容は、こんな感じです。
> * [Bower: JavaScript も CSS もまとめて管理する | deadwood](https://www.d-wood.com/blog/2013/11/10_5009.html)
### .bowerrc を作成する
パッケージのインストールディレクトリと設定ファイルを定義しておきます。
“`json
{
“directory”: “bower_components”,
“json”: “bower.json”
}
“`
### パッケージをインストールする
bower.json に設定を書き込んでくれる `–save-dev` オプションを付けて実行します。
[Bootstrap 3](http://getbootstrap.com/) と [Lightbox 2](http://lokeshdhakar.com/projects/lightbox2/) をインストールしてみます。
“`prettyprinted
% bower install –save-dev jquery
% bower install –save-dev bootstrap
% bower install –save-dev lightbox2
“`
Bootstrap には、JavaScript, css, font が含まれます。
Lightbox には、JavaScript, css, img が含まれます。
どちらも jQuery が必要です。
bower_components というディレクトリに入ります。
## Sprockets にパスを追加する
Middleman には、下記のパスが参照できるようになっています。
* source/js
* source/css
* source/fonts
* source/img
“`ruby:config.rb
config[:js_dir] = ‘js’
config[:css_dir] = ‘css’
config[:fonts_dir] = ‘fonts’
config[:images_dir] = ‘img’
“`
ここに展開されているファイルであれば、下記のような形で呼び出すことができるようになります。
“`
//= require “foo.js”
“`
bower_components 以下を呼び出せるように、Sprockets にパスを追加します。
“`ruby:config.rb
# Bower configuration
ready do
sprockets.append_path “#{root}/bower_components”
end
“`
> * [sprockets – Middlemanの中でbowerを使う – Qiita](http://qiita.com/yterajima/items/48ba70d6290850186fb5)
> * [Using Bower with Middleman – James Pearson, Ruby on Rails web developer](http://fearmediocrity.co.uk/2014/01/25/using_bower_with_middleman/)
それぞれ必要な CSS, JavaScript, Fonts, Images を呼び出していきます。
### 追記(2014/10/17)
sprockets.append_path をした状態で、asset gem の bootstrap-sass をあわせて利用したところ、build 時に LoadError が発生しました。
解決できず。
## JavaScript
main.js に読み込みます。
“`javascript:main.js
//= require “jquery/dist/jquery.min.js”
//= require “bootstrap/dist/js/bootstrap.min.js”
//= require “lightbox2/js/lightbox.min.js”
“`
## CSS
同じ形式で main.scss に読み込みます。
“`css:main.scss
//= require “bootstrap/dist/css/bootstrap.min.css”
//= require “lightbox2/css/lightbox.css”
“`
以下ダメな例。
SASS を利用しているので `@import` できるようにしたいのでこんなことをやってみました。
“`ruby:config.rb
compass_config do |config|
add_import_path = “/Users/****/projects/middleman-h5bp/bower_components/”
end
“`
“`css:main.scss
@import “bootstrap/dist/css/bootstrap.min.css”;
“`
これをコンパイルすると、いかん import となってしまいました。
“`css:main.css
@import url(bootstrap/dist/css/bootstrap.min.css);
“`
## Fonts
公式では
> bower で管理されたアセットファイル – 画像, フォントなど – を Middleman プロジェクトの中で利用するには, sprockets.import_asset を使って bower 管理下のファイルをインポートする必要があります。
と書かれており、下記が例として載っています。
これを実行すると、`js/jquery/dist/jquery.js` が作成されますが、このままでは利用しづらいです。
“`
sprockets.import_asset ‘jquery/dist/jquery.js’
“`
こちらで fonts もパスに追加してキレイに解決する方法が紹介されていました。
ありがとうございます。
> * [MiddlemanとBootswatchを使って、何分でブログを始められるか試してみた | Biblichor – scent of classics](http://biblichor.github.io/2014/02/16/start-middleman-blog-with-bootswatch-bower-scss-template.html)
.bowerrc の設定情報を元にインストールディレクトリ(今回は bower_components)を走査し、fonts ディレクトリを追加してくれています。
“`ruby:config.rb
# Bower configuration
ready do
@bower_config = JSON.parse(IO.read(“#{root}/.bowerrc”))
Dir.glob(File.join(“#{root}”, @bower_config[“directory”], “*”, “fonts”)) do |f|
sprockets.append_path f
end
sprockets.append_path File.join “#{root}”, @bower_config[“directory”]
end
“`
このように置き換えました。
`middleman build` でも /fonts へ関連ファイルが生成されていることが確認できました。
## Images
おなじく img ディレクトリも処理したいです。
img や images も走査してくれるように変更しましたが、画像ファイルの場合は、パスの追加だけではファイル生成されませんでした。
middleman-sprockets の fixtures を確認したところでは、このような形で登録する必要がありそうです。
“`ruby:config.rb
sprockets.import_asset(‘lightbox2/img/close.png’) { ‘img/close.png’ }
“`
> * [middleman-sprockets/config.rb at v3-stable · middleman/middleman-sprockets](https://github.com/middleman/middleman-sprockets/blob/v3-stable/fixtures/bower-individual-outputdir-app/config.rb)
なお `sprockets.append_path` もあわせて行わないと、`middleman server` で表示されませんでした。
## まとめ
というわけで `bower install` したコンポーネントへの対応をしました。
config.rb に無理矢理な感じで以下を追記しています。
すべての bower_components できちんと動くかは分かりませんが。。。
“`ruby:config.rb
# Bower configuration
def get_import_assets(path, split_str)
array = []
Dir.glob([“#{path}/*”, “#{path}/.*”]).each do |name|
unless File.directory?(name)
a = name.split(File.join(split_str, ‘/’))
array.push(a[1])
end
end
array
end
ready do
@bower_config = JSON.parse(IO.read(“#{root}/.bowerrc”))
bower_dir = @bower_config[‘directory’]
sprockets.append_path File.join(“#{root}”, bower_dir)
Dir.glob(File.join(“#{root}”, bower_dir, ‘*’, ‘fonts’)) do |path|
sprockets.append_path path
end
dir_names = %w(img images)
dir_names.each do |dir_name|
Dir.glob(File.join(“#{root}”, bower_dir, ‘*’, dir_name)) do |path|
sprockets.append_path path
get_import_assets(path, bower_dir).each do |image|
sprockets.import_asset(image) { File.join(dir_name, ‘/’, File.basename(image)) }
end
end
end
end
“`
スクリプトはともかく、このあたりを確認して Middleman を実戦で使えそうな気もしてきましたので、いろいろ試していきたいと思います。
## 補遺
bower_components は、別の方法を用いた方が良いのかな。
* source/css, js, img, fonts へ手動でコピーする。
* もしくは grunt で source/vendor あたりにレイアウトする。
> * [grunt-bower-task で Bower を扱いやすくレイアウトする | deadwood](https://www.d-wood.com/blog/2013/11/11_5021.html)
.bowerrc で vendor/bower におくとスッキリする。
> * [Middlemanの中でbowerを使う | e2esound.com業務日誌](http://blogged.e2esound.com//2013/05/09/bower_in_middleman_project/)
Rails では、CSS も画像もコピーされるよう。
> * [RailsプロジェクトにBowerを導入してHerokuへデプロイする // qnyp blog](http://blog.qnyp.com/2013/05/30/say-hello-to-bower/)
>
> また、Bowerによってvendor/assets/components以下にインストールされたJavaScriptライブラリに含まれるCSSファイルや画像ファイルは、ディレクトリ構成がそのままhttp://example.com/assets以下にコピーされます。
memo.
> * [Bowerとmiddlemanの統合 | dev.wan.co](http://k-shogo.github.io/article/2013/08/23/bower-middleman/)
> * [Bowerとrailsの統合 | dev.wan.co](http://k-shogo.github.io/article/2013/08/23/bower-rails/)
[/markdown]