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

Published on
Utilities
2019/11/version-manager-with-asdf
Discord

สวัสดีครับ วันนี้มาแนะนำ 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

Buy Me A Coffee
Authors
Discord