Node.jsのバージョン管理をnvmにして、Macに入れる
会社のslackにbotを入れたいとう命を受け、slackAPIを勉強中。
せっかくなので、GoogleのCloud FunctionsやAmazonのLambdaに関数を作成したいので
MacにNode.jsを入れる。
いくつか記事を見てみるとnodeには、
バージョン管理が4つほどあった。
nodebrewは日本人の人がつくったぽくて、Qiitaとかでも上げている人たくさんいた。
ただ、海外ではまだ知名度低めな感じかも。
nodenvはプロジェクトによってバージョンを自動で切り替えてくれるとか、 とても便利そうだった。
ただメンテンナンス面で不安を抱く。
nはnvmに続くstarの数で実はかなり人気な気も、、、
キーバインドもn useとかnだけでいい
結構来ている感もある。知らんけど
ただ、圧倒的にnvmがstarの数が多かったし、
いうてnode.jsそんな使うかわからないので、つまんないけど王道のnvmで試してみる。
Homebrewでインストール
$ brew install node npm
入ってくるのが11.10.0とか鬼最新版だった。
安定版をnvmでインストールする。
nvmの導入
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash
勝手に.bashrcにパスとか入れてくれたので、bashの再読込
source ~/.bash_profile
安定版のインストール
インストール可能なバージョンを調べる
$ nvm ls-remote
安定版の最新をインストール
$ nvm install v10.15.2
$ node -v
v10.15.2
バージョンを変更するときは そのバージョンをインストールして
nvm use v10.15.2とか。
Cloud Functionsとかはサポートされているnodeのバージョンが、6とか8なので、そっちもインストールしてslackAPIの開発する。
Railsでconfig_forを使ったときのsymbolize_keysについてコンソールで確認してみる。
上の記事のとき、config_forの後ろにyamlファイルの値を参照するとき、
シンボルで引っ張ってくるかどうするかみたいなときに、個人的にはシンボルで
引っ張ってあげたほうがわかりやすかった。
なんパターンかあるので、コンソールで確認してみる。
application.rbにどう書いてあるか
config.x.hogehoge = config_for(:test)config.x.hogehoge = config_for(:test).symbolize_keys-
config.x.hogehoge = config_for(:test).deep_symbolize_keys -
config.x.hogehoge = ActiveSupport::InheritableOptions.new(Rails.application.config_for(:test))
config.x.preferenceに格納した値をcontrollerで引っ張るときは、Rails.configuration.x.hogehogeで引っ張る。
ちなみに、test.ymlの中身は以下。
default: &default
hoge_k: hoge_v
fuga_k:
fuga_k_1: fuga_v_1
fuga_k_2: fuga_v_2
foo:
- bar
- baz
development:
<<: *default
test:
<<: *default
production:
<<: *default
1のとき
> test = Rails.application.config_for(:test)
=> {"hoge_k"=>"hoge_v", "fuga_k"=>{"fuga_k_1"=>"fuga_v_1", "fuga_k_2"=>"fuga_v_2"}, "foo"=>["bar", "baz"]}
> test["hoge_k"]
=> "hoge_v"
> test[:hoge_k]
=> nil
> test.hoge_k
NoMethodError: undefined method `hoge_k' for #<Hash:0x000000000567b3d0>
from (irb):4
何もつけないときは、
controllerとかではRails.configuration.x.hogehoge["fuga_k"]["fuga_k_1"] でfuga_v_2が引っ張れる。
2のとき
symbolize_keysのとき
> test = Rails.application.config_for(:test).symbolize_keys
=> {:hoge_k=>"hoge_v", :fuga_k=>{"fuga_k_1"=>"fuga_v_1", "fuga_k_2"=>"fuga_v_2"}, :foo=>["bar", "baz"]}
> test["hoge_k"]
=> nil
> test[:hoge_k]
=> "hoge_v"
> test.hoge_k
NoMethodError: undefined method `hoge_k' for #<Hash:0x00000000053315f8>
from (irb):15
> test[:fuga_k]
=> {"fuga_k_1"=>"fuga_v_1", "fuga_k_2"=>"fuga_v_2"}
> test[:fuga_k][:fuga_k_1]
=> nil
1階層目はシンボルで引っ張れるが、2階層以降は
Rails.configuration.x.hogehoge[:fuga_k]["fuga_k_1"] のようにしないとひっぱれない。
3のとき
> test = Rails.application.config_for(:test).deep_symbolize_keys
=> {:hoge_k=>"hoge_v", :fuga_k=>{:fuga_k_1=>"fuga_v_1", :fuga_k_2=>"fuga_v_2"}, :foo=>["bar", "baz"]}
> test[:fuga_k][:fuga_k_1]
=> "fuga_v_1"
これが一番いいのでは。
4のとき
> test = ActiveSupport::InheritableOptions.new(Rails.application.config_for(:test).deep_symbolize_keys)
=> {}
> test.hoge_k
=> "hoge_v"
> test.fuga_k.fuga_k_1
NoMethodError: undefined method `fuga_k_1' for {:fuga_k_1=>"fuga_v_1", :fuga_k_2=>"fuga_v_2"}:Hash
from (irb):56
> test.fuga_k[:fuga_k_1]
=> "fuga_v_1"
irb(main):059:0> test.fuga_k["fuga_k_1"]
=> nil
第一階層のみ.で繋げるが、第二階層以降はシンボルで繋がないとだめみたい。。。
ActiveSupport::InheritableOptionsってなんぞや
ActiveSupport::InheritableOptionsはシンボルでなくて、.で繋げる
> test = ActiveSupport::InheritableOptions.new({name: "Bob"})
=> {}
> test.name
=> "Bob"
既存のハッシュを.でつなげる。
ActiveSupport::InheritableOptionsは子クラスで、親クラスの
ActiveSupport::OrderedOptionsは新規に作るときにつかうやつ。
> test = ActiveSupport::OrderedOptions.new
=> {}
> test[:name] = "Alice"
=> "Alice"
> test.name
=> "Alice"
> test = ActiveSupport::OrderedOptions.new
=> {}
> test[:human] = {name: "Charlie"}
=> {:name=>"Charlie"}
> test[:human][:name]
=> "Charlie"
> test.human.name
NoMethodError: undefined method `name' for {:name=>"Charlie"}:Hash
from (irb):68
> test.human[:name]
=> "Charlie"
> test = ActiveSupport::InheritableOptions.new({human: {name: "Bob"}})
=> {}
> test.human.name
NoMethodError: undefined method `name' for {:name=>"Bob"}:Hash
from (irb):41
> test.human[:name]
=> "Bob"
ソース見ても難しかったのでわからず。
Railsで共通の設定ファイルをもちたいというとき
config_for()を用いると、シンボルでyamlファイルを指定してそこで共通の設定項目を管理できる。
config/application.rb
module Myapp
class Application < Rails::Application
config.time_zone = "Tokyo"
config.i18n.default_locale = :ja
config.active_record.default_timezone = :local
config.load_defaults 5.2
config.generators do |g|
g.assets false
g.helper false
end
config.x.preference = config_for(:preference).deep_symbolize_keys
end
end
config.x.preferenceのpreferenceは任意の値でOK。
Railsガイドに書いてあるとおり、xを挟むことでネストでも参照できる。
Railsアプリを設定する | Rails ガイド
config_for(:preference)とシンボルでpreferenceと指定しているので、
config直下にpreference.ymlを用意してあげる。
config/preference.yml
default: &default
hoge_k: hoge_v
fuga_k:
fuga_k_1: fuga_v_1
fuga_k_2: fuga_v_2
foo:
- bar
- baz
development:
<<: *default
test:
<<: *default
production:
<<: *default
controllerで引っ張ってあげたいときは、
Rails.configuration.x.preference[:hoge_k]みたいにしてあげるとhoge_vが引っ張れる。
deep_symbolized_keysとsymbolized_keysの違いについてはこちらでまとめる。