با Bun از کد Gleam فایل اجرایی مستقل بساز
خلاصهٔ کاملتر
Gleam یه زبون تایپایمنه با سیستم تایپ Hindley-Milner (یعنی تایپها خودکار استنتاج میشن و لازم نیست همهجا دستی بنویسیشون)، و بیشتر آدمها روی BEAM اجراش میکنن، همون ماشین مجازی که Erlang و Elixir روش میچرخن. ولی Gleam یه بکاند جاوااسکریپت هم داره. نویسنده که خودش روی Bun کار میکنه، تو این پست همین بکاند رو با قابلیت Single File Executable خود Bun ترکیب کرده، یعنی بستهبندی کد و رانتایم با هم توی یه فایل اجرایی.
حلقهٔ وصل، اتریبیوت @external توی Gleamه: به کامپایلر میگی فلان تابع موقع اجرا وجود داره، این ورودیها رو میگیره و این خروجی رو میده، ولی پیادهسازیش جای دیگهست. اینجا پیادهسازی یه فایل .mjs کنار فایل Gleamه که APIهای Bun مثل Bun.file() و Bun.semver.satisfies() رو صدا میزنه. به گفتهٔ نویسنده این تایپها چک نمیشن، پس درست بودنشون گردن خود توسعهدهندهست.
@external(javascript, "./bun_ffi.mjs", "readText")
fn read_text(path: String) -> Promise(String)ساخت باینری فقط دو قدمه. اول build گرفتن با تارگت جاوااسکریپت که خروجی ESM کاملاً خوانا تولید میکنه، بعد یه فایل ورودی کوچیک که تابع main رو صدا میزنه و به بندلر Bun داده میشه:
gleam build --target=javascript
bun build --compile entry.mjs --outfile dist/appخروجی dist/app یه فایل اجرایی کاملاً مستقله؛ میتونی ببریش روی ماشینی که نه Gleam داره، نه Bun و نه سورس، و بازم بدون مشکل اجرا میشه. چون Gleam موقع کامپایل فایل FFI رو کنار خروجی کپی میکنه، ایمپورت نسبی سرجاش میمونه و بندلر Bun اصلاً خبر نداره Gleam وسط بوده. با تارگت bun-linux-x64 هم میشه از مک مستقیم برای لینوکس باینری ساخت.
نکات کلیدی:
- تارگت --runtime=bun فقط مال gleam run هست؛ جاوااسکریپت تولیدشده در هر صورت یکیه.
- اتریبیوت @external تایپچک نمیشه و درستی امضای تابع گردن توسعهدهندهست.
- خروجی bun build --compile هیچ پکیج اضافهای روی سیستم کاربر نمیخواد.
- کراسکامپایل: لینوکس، مک و ویندوز روی x64 و arm64؛ روی لینوکس هم glibc هم musl.
- اولین کراسکامپایل کندتره، چون Bun باید رانتایم اون تارگت رو دانلود کنه.




