Skip to content

Windows環境実行検証

koswatana edited this page Sep 16, 2026 · 3 revisions

Windows環境実行検証

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 --version

ビルド

git 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 version

version が abrg\VERSION の版とコミットを表示すれば、ビルドできている。

キャッシュ

abrg は DuckDB のキャッシュファイルを読む。

用途 キャッシュ
検証 リポジトリの quickstart\tokyo_basic.duckdb。東京都の町字まで
実際の利用 Linux で abrdb import と abrg cache build を実行して作ったファイルをコピーする

キャッシュのパスは、次のうち最初に指定されているものに決まる。決まったパスにファイルが無いとエラーで終了し、次の候補には移らない。

  1. --cache フラグ
  2. 環境変数 ABRG_CACHE_PATH
  3. %USERPROFILE%\.abrg\cache\abrg.duckdb

CLI での照合

入力は 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

API サーバーとして使う

PowerShell から起動する

$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号"

Node.js から子プロセスとして起動する

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 が応答を返さなくなる。