Open16

いろんな言語のパッケージ作成方法について

PaalonPaalon

いろんな言語のパッケージ作成方法について公開メモを付けていく。
そもそも言語・環境によって呼び方や概念が異なることもあるはずだ。
例えば、プロジェクト、パッケージ、モジュール、ライブラリーなど似たような意味で違う使い分け方をされたりする。
ツッコミがあれば誰でもお気軽にどうぞ。

PaalonPaalon

Julia は標準ライブラリー Pkg がパッケージ作成だったり依存関係管理、ビルドなど全般を行う。

PaalonPaalon

Go は公式ドキュメントを読むと、プロジェクトとパッケージとモジュールの言葉の使い分けがされている。が、定義はどこにあるのか?

PaalonPaalon

そもそもパッケージという言葉は主に次の3つのいずれかを意味する。

  • 引用される機能群
  • 実行される機能群
  • その双方を持つ機能群

プロジェクトはパッケージに限らず、1つの作業ディレクトリー(とその配下のもの)を指す言葉か?

PaalonPaalon

Go のパッケージのレポジトリにはシングルモジュール構成とマルチモジュール構成があるらしい。

PaalonPaalon

Go のパッケージ引用はシングルモジュール構成ならばプログラム中では

import "github.com/org-name/repo-name"

となることが多い。つまりレポジトリのホスト名がプログラムに入る。レポジトリ名と引用名に関係のない Julia のPkg とは異なる。

PaalonPaalon

Go のパッケージ引用はシングルモジュール構成ならば

go get example.com/pkg

とする。

PaalonPaalon

Go の公式ブログによると、Go のパッケージ名は alllowercases である。また、短くて明確なものが良いとされる。

PaalonPaalon

Go のモジュール機能には v0 と v1 と v2 があるようだ。

PaalonPaalon

これは間違っていたようだ。作成するパッケージのバージョンの指定の話だったようだ。

PaalonPaalon

Go のパッケージ管理の疑問点その1:レポジトリ名と引用名を分離するにはどうすれば良いのか?レポジトリ名は衝突する可能性があるので、衝突させないためには引用名にも影響を及ぼしてしまう。

PaalonPaalon

レポジトリ名とモジュール名が異なることは一般的なようだ。なので気にせずレポジトリには好きな名前をつけて良いようだ。

PaalonPaalon

リポジトリ名からモジュール名は分からないことは辛そう。

PaalonPaalon

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()
}

で利用できる。