asdf เครื่องมือที่จัดการ Version ต่างๆครอบจักรวาล

Chai Phonbopit

Software Engineer & Blogger

18 November 2019

In

สวัสดีครับ วันนี้มาแนะนำ Tool สำหรับจัดการ Version ของเครื่องมือ ของภาษา Programming ต่างๆ ชื่อว่า asdf-vm สามารถจัดการได้ทั้ง Node.js, Python, Ruby, Java, Swift, Kotlin, Dart, PHP, Golang, และอื่นๆ เรียกได้ว่าครอบจักรยาน เอ้ย! จักรวาลกันเลยทีเดียว

ก่อนหน้านี้ ผมชอบ Reset เครื่อง Mac ตัวเองบ่อยๆ (แบบ Clean ไปเลย) ทุกๆ 6เดือน - 1ปี ไม่ชอบใช้ Time Machine เพราะไฟล์ git ก็อยู่ github หมด ไฟล์งานก็ Google Drive / iCloud หมดแล้ว แทบไม่มีอะไรจำเป็นในเครื่อง

ทีนี้เวลาผมลง Mac OS ผมใช้แค่ Script laptop นี้ ก็ได้ Environment ที่ตอบโจทย์การทำงานผม แทบเกือบหมดละ เหลืออาจจะมีโปรแกรมอื่นๆ เล็กๆน้อย ก็ค่อยทยอยลงเพิ่ม หรืออาจจะมี Dotfile ของตัวเอง ก็จะ base จาก dotfiles ตัวนี้เช่นกัน

asdf หรือ asdf-vm คืออะไร

asdf เป็น Version Manager ครับ ตัวจัดการกับ Version ของภาษา Programming ต่างๆครับ ซึ่งข้อดีคือ มันใช้ตัวเดียว ทำได้ทุกๆภาษาครับ

จากที่เมื่อก่อน สมมติเขียน Node.js ก็อาจจะใช้ n หรือ nvm ส่วนเขียน Ruby ก็ใช้ rbenv หรือ RVM จะเปลี่ยน Version ทีนึงก็ต้องสลับภาษา สลับ Tools และก็ใช้ไฟล์ config แยกกันอีก (ยกตัวอย่างแค่ 2 ภาษานะ ถ้าคนเขียนภาษาอื่นๆ ก็ต้องใช้ไฟล์ config และก็ Version management อื่นๆ เพิ่มเอีก)

ข้อดีของ asdf คือ

  • ตัวเดียวเอาอยู่ ใช้ไฟล์ .tools-version ไฟล์เดียวเลย
  • รองรับ config ของ Tool ตัวเก่า เช่น .node-version, nvmrc, .ruby-version อะไรพวกนี้
  • สามารถสลับ runtime ได้ ตาม folder เรา แยก local หรือใช้ global ก็ได้ เช่นโฟลเดอร์ A ใช้ local แต่ถ้าปกติ จะใช้ global ไรงี้

Install asdf-vm

คนใช้ Mac OS นั้นติดตั้งผ่าน Homebrew เลยครับ ง่ายมาก

brew install asdf

่ส่วนถ้าติดตั้งผ่าน git หรือจาก source รวมถึงตั้งค่า bash / zsh /fish แล้วแต่เครื่องครับ ลองดูรายละเอียดเพิ่มเติมประกอบเนอะ จริงๆผมไม่แน่ใจครับ ว่าต้อง set อะไรเพิ่มเติมมั้ย พอดีว่าผมรันจาก script laptop มัน install และ config ให้แล้ว 😂

ส่วน Windows User ไม่มั่นใจว่าสามารถติดตั้งผ่าน cygwin ได้มั้ยนะครับ ต้องลองไป install ดูนะครับ ส่วนนี้ขออภัยด้วยครับ

คำสั่งที่ใช้บ่อยๆ

ทีนี้มาดูคำสั่งที่ผมใช้บ่อยๆกันบ้าง

List plugins

เริ่มจาก ดู plugin ของเราว่ามีอะไรบ้าง และ list plugins ทั้งหมดที่มีของ asdf

asdf plugin-list
asdf plugin-list-all

เพิ่ม Plugins

ต้องการเพิ่ม plugins เช่นภาษา Node.js หรือ Go หรือ Dart ก็แค่

asdf plugin-add <name>
# เช่น asdf plugin-add elixir

เพิ่ม Plugin เป็น Package Manager แล้วแต่เรายังไม่มีภาษานั้นๆ ทำได้โดยการเพิ่ม

asdf install [<name> <version>]
# เช่น asdf install elixir 1.9.4

ดูรายชื่อ Version ของภาษานั้นๆ

ทีนี้ก่อน install แต่ละเวอร์ชั่น เราสามารถ list ดูว่าภาษานั้นๆมี version อะไรให้ install บ้างด้วย

asdf list-all <name>
# เช่น asdf list-all elixir

หรือจะดูว่าในเครื่อง machine เราเนี่ย install ไปกี่เวอร์ชั่นแล้วบ้าง ก็ list ได้เหมือนกัน

asdf list <name>
# เช่น asdf list exlir

ตั้งค่า Version ปัจจุบัน

มี 2 วิธีคือตั้งแบบ global และแบบ local แยกตาม folder ครับ

asdf global <name> <version>
# เช่น asdf global exlir 1.9.4

หรือเฉพาะ folder myApp เป็น เวอร์ชั่นอื่นก็ได้ เช่น

cd myApp
asdf local <name> <version>
# เช่น asdf local elixir 1.7.0

ดุ Version ปัจจุบันของทุกภาษาในเครื่อง

asdf current

ไฟล์ config แบบ global ก็จะอยู่ที่ ~/.tool-versions นั่นเอง

หมดแล้วครับ จริงๆก็เป็น Tools เล็กๆที่ผมว่าน่าจะมีประโยชน์กับ Developer เราๆทั้งหลายแน่นอน เพราะปัจจุบันคิดว่าน้อยคนนัก ที่เขียนแค่ภาษาเดียวนะ 😎

สุดท้าย

ลืมคำสั่งหรอ? พิมพ์ asdf ดุซิ

version: v0.7.5
MANAGE PLUGINS
asdf plugin-add <name> [<git-url>] Add a plugin from the plugin repo OR, add a Git repo
as a plugin by specifying the name and repo url
asdf plugin-list List installed plugins
asdf plugin-list --urls List installed plugins with repository URLs
asdf plugin-list-all List plugins registered on asdf-plugins repository with URLs
asdf plugin-remove <name> Remove plugin and package versions
asdf plugin-update <name> Update plugin
asdf plugin-update --all Update all plugins
MANAGE PACKAGES
asdf install [<name> <version>] Install a specific version of a package or,
with no arguments, install all the package
versions listed in the .tool-versions file
asdf uninstall <name> <version> Remove a specific version of a package
asdf current Display current version set or being used for all packages
asdf current <name> Display current version set or being used for package
asdf where <name> [<version>] Display install path for an installed or current version
asdf which <command> Display the path to an executable
asdf shell <name> <version> Set the package version in the current shell
asdf local <name> <version> Set the package local version
asdf global <name> <version> Set the package global version
asdf list <name> List installed versions of a package
asdf list-all <name> List all versions of a package
UTILS
asdf exec <command> [args..] Executes the command shim for current version
asdf env <command> [executable] Prints or runs an executable under a command environment
asdf reshim <name> <version> Recreate shims for version of a package
asdf shim-versions <command> List on which plugins and versions is command available
asdf update Update asdf to the latest stable release
asdf update --head Update asdf to the latest on the master branch

เฉียบ!

Happy Coding ❤️

Reference

  • #asdf
  • #asdf-vm
  • #Version Manager