Open16
いろんな言語のパッケージ作成方法について
いろんな言語のパッケージ作成方法について公開メモを付けていく。
そもそも言語・環境によって呼び方や概念が異なることもあるはずだ。
例えば、プロジェクト、パッケージ、モジュール、ライブラリーなど似たような意味で違う使い分け方をされたりする。
ツッコミがあれば誰でもお気軽にどうぞ。
Go は公式ドキュメントを読むと、プロジェクトとパッケージとモジュールの言葉の使い分けがされている。が、定義はどこにあるのか?
そもそもパッケージという言葉は主に次の3つのいずれかを意味する。
- 引用される機能群
- 実行される機能群
- その双方を持つ機能群
プロジェクトはパッケージに限らず、1つの作業ディレクトリー(とその配下のもの)を指す言葉か?
Go のパッケージのレポジトリにはシングルモジュール構成とマルチモジュール構成があるらしい。
Go のパッケージ引用はシングルモジュール構成ならばプログラム中では
import "github.com/org-name/repo-name"
となることが多い。つまりレポジトリのホスト名がプログラムに入る。レポジトリ名と引用名に関係のない Julia のPkg とは異なる。
Go のパッケージ引用はシングルモジュール構成ならば
go get example.com/pkg
とする。
Go のパッケージ管理の疑問点その1:レポジトリ名と引用名を分離するにはどうすれば良いのか?レポジトリ名は衝突する可能性があるので、衝突させないためには引用名にも影響を及ぼしてしまう。
Go のパッケージ(シングルモジュール構成)は以下のようになる。
helloworld/
├── go.mod
└── helloworld.go
1 directory, 2 files
helloworld/go.mod
module github.com/Paalon/helloworld
go 1.22.3
helloworld/helloworld.go
package helloworld
import "fmt"
func Greeting() {
fmt.Println("Hello World!")
}
これを Git レポジトリ github.com/Paalon/helloworld
に配置すれば
go get github.com/Paalon/helloworld
package main
import "github.com/Paalon/helloworld"
func main() {
helloworld.Greeting()
}
で利用できる。