SlideShare a Scribd company logo
1 of 21
ゼロから始める
Modules
自己紹介
名前 楊野 良智
出身地 不明(埼玉or大連)
学年 学部4年
技術領域 Go,Ruby,Rails,JS..etc
趣味 ガジェット,アニメ,映画..etc
Go modules is 何?
Go modules (vgo) とは
• Goコマンドに統合されたGoのパケージ(バージョン
)管理システム
• ルートにgo.modファイルを持つGoパッケージの集
まり
• Go1.11~試験的に導入
Go 1.10 以前は…
• GOPATHの下にソースコードを配置して管
理
• Githubなどの外部で公開されているパッケー
ジを go get すると$GOPATH/srcに配置され
、そこからの相対パスでimportして管理
Go modules 以前は…
Glide Dep
GOPATH管理からの変更点
GOPATH外からパッケージ管
理が行えるようになった!
go mod による管理機能!
• go mod init でmoduleの初期化が可能
• depなどで管理している既存のmoduleはgo mod init
によって自動的に変換される
• 生成されたgo.modファイルに依存関係を追加して
管理する
go mod による管理(初期化)
go mod による管理(既存)
go mod による管理(既存)
Convert
go mod による管理(go.mod)
• Goパッケージの依存関係はgo.modに
• exclude, replace, moduleディレクティブが
用意されている
go mod による管理(go.mod)
ルートディレクトリのmodule名
requireしたmoduleを置き換える
必要なmodule名とversionを追加
Minimal Version Selection
• 常に選択できるうちで最古のバージョンの
パッケージを選択して利用する
• パッケージがアップデートされても常に同
じバージョンを使い続けられる
Semantic Import Versioning
Go modules 管理の流れ
Go modules 管理の流れ
1. Project rootでgo mod init module_name
(depなど使っていればgo mod init)
2. go getなどで依存関係を追加
3. 変更点はgo.modで書き換え
まとめ
• Go modulesはGo公式のパッケージバージョン管
理機能
• Gopath外でソースコード管理できる
• Semantic Versioning, Minimal Version Selection
の導入により依存関係の闇を和らげてくれる
Go modules

More Related Content

What's hot

オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選Takuya Ueda
 
Go初心者向けハンズオン コマンドラインツールを作ろう
Go初心者向けハンズオン コマンドラインツールを作ろうGo初心者向けハンズオン コマンドラインツールを作ろう
Go初心者向けハンズオン コマンドラインツールを作ろうTakuya Ueda
 
go.mobile で Android 開発
go.mobile で Android 開発go.mobile で Android 開発
go.mobile で Android 開発Hiroshi Kurokawa
 
goパッケージで型情報を用いたソースコード検索を実現する
goパッケージで型情報を用いたソースコード検索を実現するgoパッケージで型情報を用いたソースコード検索を実現する
goパッケージで型情報を用いたソースコード検索を実現するTakuya Ueda
 
GoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンGoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンAkihiko Horiuchi
 
Go MobileでAndroidアプリ開発
Go MobileでAndroidアプリ開発Go MobileでAndroidアプリ開発
Go MobileでAndroidアプリ開発Takuya Ueda
 
Go mobileでモバイルアプリを作ろう
Go mobileでモバイルアプリを作ろうGo mobileでモバイルアプリを作ろう
Go mobileでモバイルアプリを作ろうTakuya Ueda
 
GAE/GoでLINE Messaging API を使う
GAE/GoでLINE Messaging API を使うGAE/GoでLINE Messaging API を使う
GAE/GoでLINE Messaging API を使うTakuya Ueda
 
今日から始める Go言語 と appengine
今日から始める Go言語 と appengine今日から始める Go言語 と appengine
今日から始める Go言語 と appenginea know
 
Go一緒にいかが?
Go一緒にいかが?Go一緒にいかが?
Go一緒にいかが?Ryuji Iwata
 
GAE/Goとsyncパッケージ
GAE/GoとsyncパッケージGAE/Goとsyncパッケージ
GAE/GoとsyncパッケージTakuya Ueda
 
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?naoki koyama
 
2ヶ月前にgitを始めた私からこれから始める皆さんへ
2ヶ月前にgitを始めた私からこれから始める皆さんへ2ヶ月前にgitを始めた私からこれから始める皆さんへ
2ヶ月前にgitを始めた私からこれから始める皆さんへAyana Yokota
 
Git flowについてまとめてみた
Git flowについてまとめてみたGit flowについてまとめてみた
Git flowについてまとめてみたhiroyuki koga
 
Djangoフレームワークの紹介
Djangoフレームワークの紹介Djangoフレームワークの紹介
Djangoフレームワークの紹介Shinya Okano
 
Goだけでモバイルアプリを作ろう
Goだけでモバイルアプリを作ろうGoだけでモバイルアプリを作ろう
Goだけでモバイルアプリを作ろうTakuya Ueda
 
ノンプログラマのGit入門
ノンプログラマのGit入門ノンプログラマのGit入門
ノンプログラマのGit入門Muyuu Fujita
 
Go1.8 for Google App Engine
Go1.8 for Google App EngineGo1.8 for Google App Engine
Go1.8 for Google App EngineTakuya Ueda
 

What's hot (20)

オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選
 
Go初心者向けハンズオン コマンドラインツールを作ろう
Go初心者向けハンズオン コマンドラインツールを作ろうGo初心者向けハンズオン コマンドラインツールを作ろう
Go初心者向けハンズオン コマンドラインツールを作ろう
 
go.mobile で Android 開発
go.mobile で Android 開発go.mobile で Android 開発
go.mobile で Android 開発
 
goパッケージで型情報を用いたソースコード検索を実現する
goパッケージで型情報を用いたソースコード検索を実現するgoパッケージで型情報を用いたソースコード検索を実現する
goパッケージで型情報を用いたソースコード検索を実現する
 
GoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホンGoによるWebアプリ開発のキホン
GoによるWebアプリ開発のキホン
 
Go MobileでAndroidアプリ開発
Go MobileでAndroidアプリ開発Go MobileでAndroidアプリ開発
Go MobileでAndroidアプリ開発
 
Go mobileでモバイルアプリを作ろう
Go mobileでモバイルアプリを作ろうGo mobileでモバイルアプリを作ろう
Go mobileでモバイルアプリを作ろう
 
GAE/GoでLINE Messaging API を使う
GAE/GoでLINE Messaging API を使うGAE/GoでLINE Messaging API を使う
GAE/GoでLINE Messaging API を使う
 
今日から始める Go言語 と appengine
今日から始める Go言語 と appengine今日から始める Go言語 と appengine
今日から始める Go言語 と appengine
 
Mrubyの始め方
Mrubyの始め方Mrubyの始め方
Mrubyの始め方
 
Go一緒にいかが?
Go一緒にいかが?Go一緒にいかが?
Go一緒にいかが?
 
GAE/Goとsyncパッケージ
GAE/GoとsyncパッケージGAE/Goとsyncパッケージ
GAE/Goとsyncパッケージ
 
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
新たなgitのブランチモデル「Git Feature Flow」!Git Flow,Git Hub Flow,Git Lab Flowを超えれるか?
 
2ヶ月前にgitを始めた私からこれから始める皆さんへ
2ヶ月前にgitを始めた私からこれから始める皆さんへ2ヶ月前にgitを始めた私からこれから始める皆さんへ
2ヶ月前にgitを始めた私からこれから始める皆さんへ
 
Golang入門
Golang入門Golang入門
Golang入門
 
Git flowについてまとめてみた
Git flowについてまとめてみたGit flowについてまとめてみた
Git flowについてまとめてみた
 
Djangoフレームワークの紹介
Djangoフレームワークの紹介Djangoフレームワークの紹介
Djangoフレームワークの紹介
 
Goだけでモバイルアプリを作ろう
Goだけでモバイルアプリを作ろうGoだけでモバイルアプリを作ろう
Goだけでモバイルアプリを作ろう
 
ノンプログラマのGit入門
ノンプログラマのGit入門ノンプログラマのGit入門
ノンプログラマのGit入門
 
Go1.8 for Google App Engine
Go1.8 for Google App EngineGo1.8 for Google App Engine
Go1.8 for Google App Engine
 

Similar to Go modules

Goでこれどうやるの? 入門
Goでこれどうやるの? 入門Goでこれどうやるの? 入門
Goでこれどうやるの? 入門zaru sakuraba
 
Hello GoDoc!
Hello GoDoc!Hello GoDoc!
Hello GoDoc!laco0416
 
Go言語ってどんな言語? 導入実績や気になるトレンド
Go言語ってどんな言語? 導入実績や気になるトレンドGo言語ってどんな言語? 導入実績や気になるトレンド
Go言語ってどんな言語? 導入実績や気になるトレンドAtsushi Yasuda
 
G* Workshop in Fukuoka - Introduction
G* Workshop in Fukuoka - IntroductionG* Workshop in Fukuoka - Introduction
G* Workshop in Fukuoka - IntroductionKazuchika Sekiya
 
Groovy base gradle_20130309
Groovy base gradle_20130309Groovy base gradle_20130309
Groovy base gradle_20130309Nobuhiro Sue
 
開発を彩る技術たち
開発を彩る技術たち開発を彩る技術たち
開発を彩る技術たちOda Shinsuke
 
Build insider offline session チームでのgit
Build insider offline session チームでのgitBuild insider offline session チームでのgit
Build insider offline session チームでのgitTadahiro Ishisaka
 
大容量ファイルもGitで管理。 Git LFSの使い方
大容量ファイルもGitで管理。 Git LFSの使い方大容量ファイルもGitで管理。 Git LFSの使い方
大容量ファイルもGitで管理。 Git LFSの使い方hibiki443
 
明日から使えるgradle
明日から使えるgradle明日から使えるgradle
明日から使えるgradlekimukou_26 Kimukou
 
Debug Hacks at Security and Programming camp 2011
Debug Hacks at Security and Programming camp 2011 Debug Hacks at Security and Programming camp 2011
Debug Hacks at Security and Programming camp 2011 Hiro Yoshioka
 
The History of Groovy #GroovyBase
The History of Groovy #GroovyBaseThe History of Groovy #GroovyBase
The History of Groovy #GroovyBasekyon mm
 
G*workshop sendai 20100424(v2)
G*workshop sendai 20100424(v2)G*workshop sendai 20100424(v2)
G*workshop sendai 20100424(v2)Nobuhiro Sue
 
Play framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレードPlay framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレードKazuhiro Hara
 
Potatotops20141217
Potatotops20141217Potatotops20141217
Potatotops20141217Mogi Isamu
 

Similar to Go modules (20)

Goでこれどうやるの? 入門
Goでこれどうやるの? 入門Goでこれどうやるの? 入門
Goでこれどうやるの? 入門
 
Hello GoDoc!
Hello GoDoc!Hello GoDoc!
Hello GoDoc!
 
Go入門
Go入門Go入門
Go入門
 
Vue.js with Go
Vue.js with GoVue.js with Go
Vue.js with Go
 
Go言語ってどんな言語? 導入実績や気になるトレンド
Go言語ってどんな言語? 導入実績や気になるトレンドGo言語ってどんな言語? 導入実績や気になるトレンド
Go言語ってどんな言語? 導入実績や気になるトレンド
 
G* Workshop in Fukuoka - Introduction
G* Workshop in Fukuoka - IntroductionG* Workshop in Fukuoka - Introduction
G* Workshop in Fukuoka - Introduction
 
Groovy base gradle_20130309
Groovy base gradle_20130309Groovy base gradle_20130309
Groovy base gradle_20130309
 
開発を彩る技術たち
開発を彩る技術たち開発を彩る技術たち
開発を彩る技術たち
 
Gopenflow demo v1
Gopenflow demo v1Gopenflow demo v1
Gopenflow demo v1
 
Build insider offline session チームでのgit
Build insider offline session チームでのgitBuild insider offline session チームでのgit
Build insider offline session チームでのgit
 
Golang handson
Golang handsonGolang handson
Golang handson
 
社内勉強会1 go lang
社内勉強会1 go lang 社内勉強会1 go lang
社内勉強会1 go lang
 
大容量ファイルもGitで管理。 Git LFSの使い方
大容量ファイルもGitで管理。 Git LFSの使い方大容量ファイルもGitで管理。 Git LFSの使い方
大容量ファイルもGitで管理。 Git LFSの使い方
 
gomobile
gomobilegomobile
gomobile
 
明日から使えるgradle
明日から使えるgradle明日から使えるgradle
明日から使えるgradle
 
Debug Hacks at Security and Programming camp 2011
Debug Hacks at Security and Programming camp 2011 Debug Hacks at Security and Programming camp 2011
Debug Hacks at Security and Programming camp 2011
 
The History of Groovy #GroovyBase
The History of Groovy #GroovyBaseThe History of Groovy #GroovyBase
The History of Groovy #GroovyBase
 
G*workshop sendai 20100424(v2)
G*workshop sendai 20100424(v2)G*workshop sendai 20100424(v2)
G*workshop sendai 20100424(v2)
 
Play framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレードPlay framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレード
 
Potatotops20141217
Potatotops20141217Potatotops20141217
Potatotops20141217
 

Go modules

Editor's Notes

  1. Go1.11から導入されてGoのパッケージバージョン管理システム moduleとはプロジェクトルートにgo.modファイルを持つGoパッケージの集まり Go1.12, 1.11ではmodule-aware modeとgopathモードの2つがあり環境変数GO111MODULEをon,off,autoにすることによりモードの切り替えが可能。 module-aware modeが今回紹介するgo modulesを使うモード Go1.13からデフォルトでmodule-aware modeになる
  2. Go 1.10以前はGOPATHと呼ばれるパスの配下にソースコードを置いてパッケージを管理していた バージョン機能などはなくgo getをするとgo1のタグブランチかmasterからコードを取得していた
  3. または、GlideやDepなどのサードパーティー製のバージョン管理ツールを使用して管理をしていた
  4. 今回、Go modulesではGoコマンド本体に公式のバージョン管理ツールが実装された 主な特徴としてはGOPATH外でソースコードの管理を行えるようになったり Version選択にMinimal Version selection, Version表現にSemantic Import Versioningなどのアルゴリズムが採用されたことである
  5. Go コマンドではgo modというバージョン管理用のサブコマンドが追加されこれによってmoduleの管理を行う また、depやGlideなどを使っている既存のプロジェクトもmodコマンドによってmoduleを使った管理方法に簡単に移行できる go modはプロジェクトルートに置かれたgo.modファイルによってパッケージの依存関係の管理を行う
  6. プロジェクトの初期化の場合は上記のようにするとgo.modファイルが生成されmodule機能が初期化される
  7. Glideやdepなどを使う場合は上記のようにmodule名を指定せずにmod initを行うとGlideやdepなどの管理ファイルからgo.modの依存ファイルに自動的に変換を行い、依存関係をコピーできる
  8. go.modはexclude,replace,moduleディレクティブなどにパッケージ、バージョンの追加を行い依存関係の管理を行う
  9. 使い方としては Module ルートディレクトリのモジュール名を指定 Require 必要なmodule名とversionを指定 Replace requireしたmoduleを置き換える exclude 明示的に除外するmoduleを指定する
  10. GoではMinimal Version Selectionというアルゴリズムを採用しており 常に選択できるうちで最古のパッケージを選択するようになっている 指定すればバージョンを新しくすることは可能 それによってパッケージがアップデートされても常に同じバージョンを使い続けられる
  11. また、go modulesではバージョン管理にSemantic Versioningを採用しており 一番目にあるMajor Version 二番目のMinor Version 三番目のPatchesごとに機能ごとによって上げるバージョンを変えることによって依存性地獄を回避できる
  12. 指定すればバージョンを新しくすることは可能
  13. Project rootでgo mod init module_name (depなど使っていればgo mod init) go getなどで依存関係を追加 変更点はgo.modで書き換え
  14. 指定すればバージョンを新しくすることは可能