対応表
Ruby | Node.js | Go | |
---|---|---|---|
言語バージョン管理ツール | rvm, rbenv <例> rbenv install 3.0.0 && rbenv local 3.0.0 #=> 3.0.0 (set by /Users/yokoto/.rbenv/version) |
nvm, nodenv, n <例> nvm install 19.2.0 && nvm use 19.2.0 #=> Now using node v19.2.0 (npm v8.19.3) |
go, goenv <例> go install golang.org/dl/go1.18.8 && go1.18.8 download #=> go version go1.18.8 darwin/arm64 |
レジストリ(パッケージ管理システム) | RubyGems https://rubygems.org |
npm(Node Package Manager) https://www.npmjs.com |
go https://pkg.go.dev |
パッケージ依存関係管理クライアント | gem, Bundler <例> gem install bundler && bundler -v #=> Bundler version 2.3.26 |
npm, yarn <例> ## npm npm install -g npm && npm version #=> { npm: '8.19.3', node: '19.2.0', ...,} ## yarn npm install -g yarn && yarn version #=> 3.2.0 |
GOPATH, Go Modules <例> go version #=> go version go1.18.8 darwin/arm64 |
パッケージバージョン・依存関係管理ファイル | Gemfile Gemfile.lock <例> bundle init && Gemfileの書き換え && bundle install |
## npm package.json package-lock.json <例> npm init && package.jsonの書き換え && npm install ## yarn package.json yarn.lock <例> yarn init && package.jsonの書き換え && yarn install |
go.mod go.sum <例> go mod init yokoto/go-mod-demo && go.modの書き換え && go mod tidy |
特定パッケージの依存関係確認方法 | ・ RubyGems.orgの特定のgemのページ Gemfile.lockを確認する ・gem dependency -R nokogiri |
## npm ・package-lock.jsonを確認する ・npm ls react ・npm view react dependencies ## yarn ・yarn.lockを確認する ・yarn list react ・yarn info react dependencies |
・go.modファイルを確認する ・go list ・go mod graph |
パッケージのインストール先ディレクトリ | app_root/.bundle/ruby/2.7.0/gems(デフォルト), app_root/vendor/bundle/ruby/3.0.0/gems/(よくある) | app_root/node_modules/ | \$GOPATH/bin, \$HOME/go/bin |
特定パッケージの最新バージョンへのアップデートコマンド | bundle update nokogiri --conservative | ## npm npm uninstall react && npm install react ## yarn yarn remove react && yarn add react |
go get gopkg.in/yaml.v3 && go mod tidy |
Ruby
ポイント
-
require: false
- Bundlerはconfig/application.rbにある
Bundler.require(*Rails.groups)
という記述によって、Gemfile内のgemをrequire
(= 各ファイルにライブラリをロード)するが、require: false
を指定することでgemをインストールする一方require
しないようにする。 - たとえば、コマンドラインから実行するrubocop等のgemはRailsアプリケーションのプロセスで読み込む必要がないし、
rake
タスクでのみ使用するgemはそのタスク内でのみgemをrequire
するようにした方がメモリ効率が良い。
- Bundlerはconfig/application.rbにある
-
group: :production, :development, :test do ~ end
-
group
で指定した環境のみにgemをインストールすることができる。
-
-
bundle install
vsbundle install --path vendor/bundle
vsbundle update
-
bundle install
- Gemfile.lockがあれば、Gemfile.lockの内容に基づいてgemをインストールする。
- Gemfile.lockがなければ、Gemfileを元にGemfile.lockを作成し、gemをインストールする。
-
--path
やBUNDLE_PATH
の指定がない場合、gemをグローバル(システム)にインストールする。-
gem environment
やbundle config
によってgemのインストール先を確認できる。
-
-
bundle install --path vendor/bundle
- gemを
vendor/bundle
ディレクトリ配下にインストールする。
- gemを
-
bundle update
- Gemfileの内容に基づいてGemfile.lockを更新する。
-
-
bin
vsbundle exec
-
bin
- 実行可能ファイル(バイナリ)が入っているディレクトリ。
-
binstub
というスクリプトによってラップされて実行される。 -
bin
を使うとSpringを起動でき、結果としてコマンドの実行が高速になる。
-
bundle exec
-
bundle exec
をつけると現在のプロジェクトでインストールされたgemを使用してコマンドを実行する。 - つけないと、システム共通のgemを使用してコマンドを実行する。
-
bundle binstubs(bundle install --binstubs)
を実行し、指定したgemのbinstubsを作成すれば、bundle exec
を打たずにbin
を付けるだけでコマンド実行することができる。例)./bin/rspec
,./bin/rake
-
-
Gemfile
source 'https://rubygems.org'
gem 'nokogiri'
Gemfile.lock
GEM
remote: https://rubygems.org/
specs:
nokogiri (1.13.9-x86_64-darwin)
racc (~> 1.4)
racc (1.6.0)
PLATFORMS
x86_64-darwin-19
DEPENDENCIES
nokogiri
BUNDLED WITH
2.3.26
Node.js
ポイント
-
npm install
vsnpm install -g [package]
vsnpm install [package] (-S(--save) / -P(--save-prod))
vsnpm install [package] -D(--save-dev)
-
npm install
- package-lock.jsonがあれば、package.json と package-lock.json に基づいて
dependencies
とdevDependencies
がすべてローカル(node_modules)にインストールされる。 - package-lock.jsonがなければ、package.json を元にpackge-lock.jsonを作成し、
dependencies
とdevDependencies
がすべてローカル(node_modules)にインストールされる。
- package-lock.jsonがあれば、package.json と package-lock.json に基づいて
-
npm install --production
- package.jsonの
dependencies
に記述されたパッケージだけがnode_modulesにインストールされる。 - Rubyの
bundle install
に相当する。
- package.jsonの
-
npm install -g [package]
- パッケージはグローバルに(プロジェクトの外側のユーザー単位で)インストールされる。
- package.jsonには記述されない。
- 例:
npm install -g yarn
- 例:
- Rubyの
gem install [package]
に相当する。
-
npm install [package] (-S(--save) / -P(--save-prod))
- package.jsonの
dependencies
に記述する。 - package.jsonの
dependencies
に記述されたパッケージは本番環境で使用することができる。- 例: react、vue
- package.jsonの
-
npm install [package] -D(--save-dev)
- package.jsonの
devDependencies
に記述する。 - package.jsonの
devDependencies
に記述されたパッケージは開発時のみに使用することができる。- 例: jest、eslint、webpack、typescript
- package.jsonの
-
- Semantic Versioning
- Major・Minor・Patch
package.json
package.json
{
"name": "node-js-demo",
"version": "1.0.0",
"description": "first node js project",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "yokoto",
"license": "ISC",
"dependencies": {
"react": "^18.2.0"
}
}
package-lock.json
package-lock.json
{
"name": "node-js-demo",
"version": "1.0.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "node-js-demo",
"version": "1.0.0",
"license": "ISC",
"dependencies": {
"react": "^18.2.0"
}
},
"node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
},
"node_modules/loose-envify": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
"dependencies": {
"js-tokens": "^3.0.0 || ^4.0.0"
},
"bin": {
"loose-envify": "cli.js"
}
},
"node_modules/react": {
"version": "18.2.0",
"resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
"integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
"dependencies": {
"loose-envify": "^1.1.0"
},
"engines": {
"node": ">=0.10.0"
}
}
},
"dependencies": {
"js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
},
"loose-envify": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
"requires": {
"js-tokens": "^3.0.0 || ^4.0.0"
}
},
"react": {
"version": "18.2.0",
"resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
"integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
"requires": {
"loose-envify": "^1.1.0"
}
}
}
}
Go
ポイント
- 〇〇env
- 複数バージョンの処理系を混在させるために、Rubyでは rbenv、Node.jsではnodenv などのツールが普及しており、Goでも goenv のようなツールがある。
- しかし、Goには v1 系に関しては後方互換性が保たれるため、(常にバージョンアップできていれば)プロジェクトごとにバージョンを固定する必要はない。
- また、Goには公式で複数バージョンを混在させる方法が提供されている。
- 複数バージョンの処理系を混在させるために、Rubyでは rbenv、Node.jsではnodenv などのツールが普及しており、Goでも goenv のようなツールがある。
-
GOPATH
vs GoModules- ~v1.10
-
GOPATH
を使用してライブラリのパッケージ管理が行われていた。- 環境変数
GOPATH
で指定されたディレクトリの配下でソースコードを管理する必要があった。
- 環境変数
-
- v1.11~
- Go Modules(go.mod・go.sum)というツールチェーンを使用してライブラリのモジュール管理が行われるようになった。
- 標準ライブラリを除く全てのパッケージをモジュールとして管理できるようになった(npmなどと同様の方法)。
- Go Modules(go.mod・go.sum)というツールチェーンを使用してライブラリのモジュール管理が行われるようになった。
- ~v1.15
-
go build
やgo test
といったコマンドの実行時に go.mod および go.sum ファイルが更新されていた。
-
- v1.16~
-
go mod tidy
を実行すると go.mod および go.sum ファイルが更新されるようになった。
-
- ~v1.10
-
go install
vsgo get
-
go install
- Go 1.16以降では、バイナリをビルドしてグローバルインストールのためのコマンドとして利用される。
- ビルドされた実行可能なバイナリは、グローバル(
$GOPATH/bin
ディレクトリ)にインストールされる。 - バージョンも指定してパッケージをダウンロードすることが可能になった。
- 例:
go install golang.org/x/tools/gopls@latest
- 例:
- ビルドされた実行可能なバイナリは、グローバル(
- Go 1.16以降では、バイナリをビルドしてグローバルインストールのためのコマンドとして利用される。
-
go get
- Go 1.16以降では、go.mod を編集するためだけのコマンドとして利用される。
- コードにimport文を書いてから go.mod に反映する方法
-
go get
&&go mod tidy
-
- importされていないモジュールを go.mod に追加する方法
go get <package>[@<version>] # 実行後、手作業で go.mod を編集する
-
main.go
package main
import (
"fmt"
"rsc.io/quote"
)
func main() {
fmt.Println(quote.Go())
}
go.mod
module yokot/go-mod-demo
go 1.18
require rsc.io/quote v1.5.2
require (
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c // indirect
rsc.io/sampler v1.3.0 // indirect
)
go.sum
module yokot/go-mod-demo
go 1.18
require rsc.io/quote v1.5.2
require (
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c // indirect
rsc.io/sampler v1.3.0 // indirect
)