LoginSignup
3
2

Ruby・Node.js・Goのライブラリバージョン管理比較

Last updated at Posted at 2022-12-04

対応表

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 するようにした方がメモリ効率が良い。

  • group: :production, :development, :test do ~ end
    • group で指定した環境のみにgemをインストールすることができる。

  • bundle install vs bundle install --path vendor/bundle vs bundle update
    • bundle install
      • Gemfile.lockがあれば、Gemfile.lockの内容に基づいてgemをインストールする。
      • Gemfile.lockがなければ、Gemfileを元にGemfile.lockを作成し、gemをインストールする。
      • --pathBUNDLE_PATH の指定がない場合、gemをグローバル(システム)にインストールする。
        • gem environmentbundle config によってgemのインストール先を確認できる。
    • bundle install --path vendor/bundle
      • gemを vendor/bundle ディレクトリ配下にインストールする。
    • bundle update
      • Gemfileの内容に基づいてGemfile.lockを更新する。

  • bin vs bundle 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 vs npm install -g [package] vs npm install [package] (-S(--save) / -P(--save-prod)) vs npm install [package] -D(--save-dev)
    • npm install
      • package-lock.jsonがあれば、package.json と package-lock.json に基づいて dependenciesdevDependencies がすべてローカル(node_modules)にインストールされる。
      • package-lock.jsonがなければ、package.json を元にpackge-lock.jsonを作成し、dependenciesdevDependencies がすべてローカル(node_modules)にインストールされる。
    • npm install --production
      • package.jsonの dependencies に記述されたパッケージだけがnode_modulesにインストールされる。
      • Rubyの bundle install に相当する。
    • 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
    • npm install [package] -D(--save-dev)
      • package.jsonの devDependencies に記述する。
      • package.jsonの devDependencies に記述されたパッケージは開発時のみに使用することができる。
        • 例: jest、eslint、webpack、typescript
  • 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

  • GOPATH vs GoModules
    • ~v1.10
      • GOPATH を使用してライブラリのパッケージ管理が行われていた。
        • 環境変数 GOPATH で指定されたディレクトリの配下でソースコードを管理する必要があった。
    • v1.11~
      • Go Modules(go.mod・go.sum)というツールチェーンを使用してライブラリのモジュール管理が行われるようになった。
        • 標準ライブラリを除く全てのパッケージをモジュールとして管理できるようになった(npmなどと同様の方法)。
    • ~v1.15
      • go buildgo test といったコマンドの実行時に go.mod および go.sum ファイルが更新されていた。
    • v1.16~
      • go mod tidy を実行すると go.mod および go.sum ファイルが更新されるようになった。

  • go install vs go get
    • go install
      • Go 1.16以降では、バイナリをビルドしてグローバルインストールのためのコマンドとして利用される。
        • ビルドされた実行可能なバイナリは、グローバル($GOPATH/bin ディレクトリ)にインストールされる。
        • バージョンも指定してパッケージをダウンロードすることが可能になった。
          • 例: go install golang.org/x/tools/gopls@latest
    • go get
      • Go 1.16以降では、go.mod を編集するためだけのコマンドとして利用される。
      1. コードにimport文を書いてから go.mod に反映する方法
        • go get && go mod tidy
      2. 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
)
3
2
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
3
2