とーますメモ

Ruby on Rails / Goなどの学習メモ

【Rails5】アセットパイプライン(Asset Pipeline)についてのまとめ

自分用メモ。

そもそもアセットパイプラインのプリコンパイルとは?

プリコンパイルは、複数のファイルをいっこにまとめて、圧縮して、ファイル名にフィンガープリント(ダイジェスト)をつけて、公開ディレクトリにデプロイする、などの作業と解釈してます。
プリコンパイルされていないアセットは、production環境では見ることができません。配信したいアセットがプリコンパイルの対象になっていることを確認する必要があります。

by Rails Asset Pipelineがうまくいかないときの問題の切り分けかた


自分が思っているProduction環境でのアセットパイプラインの流れ

1)コンパイル対象のファイル(デフォルトだとapplication.jsとapplication.css)を追加
追加することでパイプラインで生成されるファイルを増やすことができる。

2)アセット対象のパスを追加
追加することでコンパイル対象ファイル内に記述することができる。

3)パイプラインから生成されたファイルをstylesheet_link_tagやjavascript_include_tagで読み込む

アセット対象のパスを追加

config/initializers/assets.rb内

Rails.application.config.assets.paths << Rails.root.join("vendor", "original_assets", "images")
Rails.application.config.assets.paths << Rails.root.join("vendor", "original_assets", "stylesheets")
Rails.application.config.assets.paths << Rails.root.join("vendor", "original_assets", "javascripts")

指定したファイルをコンパイル対象にする

Rails.application.config.assets.precompile += %w( user.js admin.js user.css admin.css )

フォント系の問題

外部ライブラリのCSSファイル内で相対パスで書いてある場合、Production環境だと
CSSがapplication.cssに集約されるため、フォントが読み込めなくなる。
その場合は、「絶対パス」に変更するなどの対応が必要になる。

その他トラブルシューティング

以下参照。
Rails Asset Pipelineがうまくいかないときの問題の切り分けかた

作成されたアセットファイル群を消す方法

$ bundle exec rake assets:clobber

現在設定されているassetsのパス

$ bundle exec spring rails c
$> Rails.application.config.assets.paths

プレコンパイル済みのアセットが配置されるディレクトリ

$ bundle exec spring rails c
$> Rails.application.config.assets.prefix

【Rails】Production環境のために必要な設定

自分用メモ。

1)環境変数の設定
以下の環境変数を「.bashrc」に設定。※Capistranoで読み込む環境変数の場合、.bash_profileだと読み込んでくれないため。
以下の詳細。
thoames.hatenadiary.jp

①RAILS_ENV(設定しておけば、コマンドで逐一入れなくても良くなる)
②DATABASE_PASSWORD(production環境のDBに接続するためのパスワード)
③SECRET_KEY_BASE(秘密鍵の設定)

2)assets:precompileの設定

5.1からyarnが必須になったっぽい。
npmをインストールし、yarnを以下のようにインストールすれば良い。

$ npm install yarn -g

3)config/environments/production.rbの設定

config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?

config.public_file_server.enabled = true

に変更

[参考]
Rails5でnginx+pumaでproduction環境を構築する · atwata developer blog

【Capistrano】環境変数が読み込まれない!? その場合の対応方法

自分用メモ。

環境変数を「.bash_profile」に設定した場合
読み込まれなかったため、原因を検索してみたら以下の記事がひかかった。

Capistrano で.bash_profileに書いてある環境変数が読まれない件
ruby on rails - Capistrano and environment variables - Stack Overflow

どうやらCapistranoは.bash_profileは読み込ま長い、.bashrcは読み込むらしい。

ただ注意しないといけないのは、以下の行より「上」に環境変数を設定しないといけないこと。

# If not running interactively, don't do anything
[ -z "$PS1" ] && return


話は変わるが、以下のようにCapistrano自体に環境変数の設定をすることも可能っぽい。

set :default_environment, { 
  'env_var1' => 'value1',
  'env_var2' => 'value2'
}

またデバックとして、「require 'capistrano/console'」をCapfileに入れることで
以下のコマンドが使用でき、Capistranoと同じ条件で、サーバに入ることができる。

例)production環境に入る例

$ bundle exec cap production console


[参考]
Capistrano で.bash_profileに書いてある環境変数が読まれない件

【Rails】Mac上でImagemagick + RMagickをインストール

Imagemagickはコマンドラインから画像の操作や表示ができるツール。
多くのOS及び言語から使用できるため人気がある。

RMagickはRuby用のImagemagickインターフェース。
RubyからImagemagickを使用する場合は、このgemをインストールする。

Imagemagickのインストール

RMagickはimagemagickのバージョン6にしか対応していないので
バージョン6をインストール。

$ brew install imagemagick@6

パスを.bash_profileに設定

export PATH="/usr/local/opt/imagemagick@6/bin:$PATH"
$ source ~/.bash_profile

以下のコマンドでバージョン情報が表示されれば、インストール完了

$ convert --version

RMagickのインストール

インストール

gem 'carrierwave'
gem 'rmagick'

このままインストールすると、以下のエラーが出てインストールできない。

Package MagickCore was not found in the pkg-config search path.
Perhaps you should add the directory containing `MagickCore.pc'
to the PKG_CONFIG_PATH environment variable
No package 'MagickCore' found

MagickCore.pcが含まれるパスであるPKG_CONFIG_PATHを
環境変数に設定する必要がある。

.bash_profile

export PKG_CONFIG_PATH="/usr/local/opt/imagemagick@6/lib/pkgconfig:$PATH"
$ source ./bash_profile

インストール

$ bundle install

[参考]
Macにrmagickをインストールする - Qiita
RMagickのインストールでエラー - Qiita

【Ansible】Macのbrew経由でAnsibleのバージョンを上げたら、ansible.cfgを読み込まなくなったっぽい。

自分用メモ。

以前はansible.cfgを「/usr/local/bin/ansible/ansible.cfg」に置いており、
「/usr/local/bin/ansible/」内に「apps」ディレクトリを作成し、
さらにその中に各プロジェクトのディレクトリを作成し、プレイブックをその中に置いていた。

こんなイメージ

├── apps
│   └── project1
│       ├── hosts
│       │   ├── production
│       │   └── staging
│       ├── log
│       │   └── ansible.log
│       └── playbook
│           ├── dbservers.yml
│           ├── group_vars
│           │   ├── production.yml
│           │   └── staging.yml
│           ├── roles
├── ansible.cfg

実行するときは、各プロジェクト内に移動し、その後にプレイブックをのコマンドを叩いていた。

例)

$ cd apps/project1 && ansible-playbook -i hosts/staging playbook/site.yml

以前(バージョンは忘れた・・・2.2とかだった気がする)は、上記の構成とコマンドでansible.cfg内の設定を
読み込んでくれていたが、バージョンを2.5.3に上げたら、読み込まなくなりansible.cfg内で設定していたremote_userが効かなくなったため
サーバにSSHログインできなくなった。

公式ドキュメントを見ると、以下の順でansible.cfgは読み込まれる。

① ANSIBLE_CONFIG (environment variable if set)
② ansible.cfg (in the current directory)
③ ~/.ansible.cfg (in the home directory)
④ /etc/ansible/ansible.cfg

Ansible Configuration Settings — Ansible Documentation

このドキュメントを見ると、そもそもプロジェクトのフォルダに移動して、コマンドを実行してもansible.cfgは読み込まれないように見えるが
以前のバージョンでは動作していた。。。

なので、ansible.cfgを各プロジェクト内直下に置き、実行してみたところ動作した。
以下がその構成。

├── apps
│   └── project1
│       ├── ansible.cfg
│       ├── hosts
│       │   ├── production
│       │   └── staging
│       ├── log
│       │   └── ansible.log
│       └── playbook
│           ├── dbservers.yml
│           ├── group_vars
│           │   ├── production.yml
│           │   └── staging.yml
│           ├── roles

[参考]
Ansible: path to ansible.cfg - Stack Overflow

【Ansible】Macのbrew経由でPythonをインストールしたら、Ansibleが動作しなくなった。

表題のとおりだが、
今まで動いていたAnsibleが以下のエラーを吐くようになった。

dyld: Library not loaded: @executable_path/../.Python
 Referenced from: /usr/local/Cellar/ansible/2.5.2/libexec/bin/python2.7
 Reason: image not found

いろんなサイトを見ると、よくわからないがリンクが切れたどうだとかの
書いてあったので、ansibleをアンインストールし

$ brew uninstall ansible

再インストールしたら直った。

$ brew install ansible


[参考]
ansible --version dyld: Library not loaded: @executable_path/../.Python · Issue #39435 · ansible/ansible · GitHub