Repository navigation
Windows環境実行検証
koswatana edited this page Sep 16, 2026
·
3 revisions
Docker を使わずに Windows で abrg.exe をビルドし、CLI と API サーバーとして動くかを確かめる。アプリが abrg.exe を子プロセスとして起動し、localhost の API を呼ぶ構成を対象とする。
| 項目 | 値 |
|---|---|
| abrg | 3.0.52 |
| OS | Windows 11 の x64 |
| シェル | PowerShell 5.1 |
ビルドには次のソフトウェアが必要になる。ビルドした abrg.exe が依存するのは Windows 標準の DLL なので、abrg.exe を実行する PC では、これらは必要ない。
| ソフトウェア | 版 | 入手先 |
|---|---|---|
| Git for Windows | 任意 | https://git-scm.com/download/win |
| Go | 1.27 系 | https://go.dev/dl/ の MSI |
| GCC | MinGW-Builds 14.2.0 の UCRT 版 | https://github.com/niXman/mingw-builds-binaries/releases/download/14.2.0-rt_v12-rev0/x86_64-14.2.0-release-posix-seh-ucrt-rt_v12-rev0.7z |
GCC は表の版に合わせる。abrg が組み込む DuckDB のライブラリが MinGW-Builds 14.2.0 で作られているためで、MSYS2 の GCC 16.2.0 ではリンクが undefined reference to '__emutls_v._ZSt11__once_call' で失敗する。DuckDB の版を上げたときは、go.mod の duckdb-go-bindings が参照する lib/windows-amd64 のライブラリを作った GCC に合わせ直す。
tar -xf x86_64-14.2.0-release-posix-seh-ucrt-rt_v12-rev0.7z -C C:\
C:\mingw64\bin\gcc.exe --versiongit clone https://github.com/digital-go-jp/abr-geocoder.git
cd abr-geocoder
git checkout release/3.0.52
$env:Path = "C:\mingw64\bin;$env:Path"
$env:CGO_ENABLED = "1"
$version = (Get-Content abrg\VERSION -Raw).Trim()
$commit = git rev-parse --short HEAD
$pkg = "github.com/digital-go-jp/abr-geocoder/common/version"
go -C abrg build "-ldflags=-s -w -extldflags=-static -X $pkg.Version=$version -X $pkg.Commit=$commit" -o abrg.exe ./cmd/abrg
abrg\abrg.exe versionversion が abrg\VERSION の版とコミットを表示すれば、ビルドできている。
abrg は DuckDB のキャッシュファイルを読む。
| 用途 | キャッシュ |
|---|---|
| 検証 | リポジトリの quickstart\tokyo_basic.duckdb。東京都の町字まで |
| 実際の利用 | Linux で abrdb import と abrg cache build を実行して作ったファイルをコピーする |
キャッシュのパスは、次のうち最初に指定されているものに決まる。決まったパスにファイルが無いとエラーで終了し、次の候補には移らない。
-
--cacheフラグ - 環境変数
ABRG_CACHE_PATH %USERPROFILE%\.abrg\cache\abrg.duckdb
入力は 1 行に 1 件の住所を書いた UTF-8 のファイル。
[IO.File]::WriteAllText("$PWD\input.txt", "東京都千代田区紀尾井町1番3号`r`n東京都新宿区西新宿二丁目8番1号`r`n")
$env:ABRG_CACHE_PATH = "$PWD\quickstart\tokyo_basic.duckdb"
abrg\abrg.exe match -q -i input.txt -o output.jsonl$env:ABRG_CACHE_PATH = "$PWD\quickstart\tokyo_basic.duckdb"
$env:ABRG_HTTP_HOST = "127.0.0.1"
$env:ABRG_HTTP_PORT = "3000"
abrg\abrg.exe serve- localhost からの利用に限るなら、
ABRG_HTTP_HOSTに127.0.0.1を設定する。- 設定しないと、すべてのインターフェースで待ち受ける。
- すべてのインターフェースで待ち受けると、初回の起動で Windows ファイアウォールのダイアログが表示される。
- 停止は Ctrl+C。
別の PowerShell ウィンドウで、次のコマンドを実行する。
curl.exe -G "http://127.0.0.1:3000/match" --data-urlencode "address=東京都千代田区紀尾井町1番3号"import { spawn } from "node:child_process";
const port = 3000;
const abrg = spawn("C:\\app\\bin\\abrg.exe", ["serve"], {
windowsHide: true,
stdio: ["ignore", "ignore", "pipe"],
env: {
...process.env,
ABRG_CACHE_PATH: "C:\\app\\data\\abrg.duckdb",
ABRG_HTTP_HOST: "127.0.0.1",
ABRG_HTTP_PORT: String(port),
},
});
abrg.stderr.on("data", (chunk) => process.stderr.write(chunk));
abrg.on("exit", (code, signal) => console.error(`abrg exited: code=${code} signal=${signal}`));
async function waitReady(timeoutMs = 10_000) {
const url = `http://127.0.0.1:${port}/match?address=${encodeURIComponent("東京都")}`;
const deadline = Date.now() + timeoutMs;
while (Date.now() < deadline) {
try {
const res = await fetch(url);
await res.arrayBuffer();
if (res.ok) return;
} catch {}
await new Promise((resolve) => setTimeout(resolve, 100));
}
throw new Error("abrg did not become ready");
}
await waitReady();
const res = await fetch(
`http://127.0.0.1:${port}/match?address=${encodeURIComponent("東京都千代田区紀尾井町1番3号")}`,
);
console.log(JSON.stringify(await res.json(), null, 2));
abrg.kill();- 標準出力には、リクエストごとのアクセスログが出力される。
-
pipeにした場合は読み続ける。 - 読まないとパイプのバッファが埋まり、数百回で
/matchが応答を返さなくなる。
-