“asdf” รวบตึงทุก Version Manager มาไว้ในตัวเดียว
หลายๆคนที่ทำงานหลายๆ project แล้วแต่ละงานนั้น ดันใช้ Programing Languages หรือ Tools ต่างๆ คนละ version กัน ไม่ว่าจะ Node.js ที่ใช้ nvm…
“asdf” รวบตึงทุก Version Manager มาไว้ในตัวเดียว
หลายๆคนที่ทำงานหลายๆ project แล้วแต่ละงานนั้น ดันใช้ Programing Languages หรือ Tools ต่างๆ คนละ version กัน ไม่ว่าจะ Node.js ที่ใช้ nvm, Golang ที่ใช้ gvm, g หรือภาษาใดๆก็ตาม ซึ่งแต่ละตัวก็มี version manager เยอะซะจนไม่รู้จะใช้ไม่ถูก สลับไปมาจนวุ่นวายไปหมด ลง tools จน shell ช้า หรือต้องมา switch version เองตามแต่ละงาน ถ้าหากว่าเบื่อ งั้นลองมาใช้ตัวนี้กันครับ

“asdf” The Multiple Runtime Version Manager
(บ่นๆ ข้ามได้..) ต้องขอเล่าก่อนว่า เดิมทีงานที่ทำอยู่เป็นงาน Platform ใหญ่ๆตัวนึง ที่ใหญ่มากๆ มี Repository ใน git รวมทั้ง ฝั่ง client, server, document หรือ tools ต่างๆที่ใช้ทำงาน มีรวมๆก็ไม่ต่ำกว่า 10 บางตัวก็ active มี contribute อยู่ตลอด บางตัวก็ นานๆทีจะได้ไปแตะมัน พอไปแตะอีกที Dependencies ก็ out-dated ไปแล้วบ้าง บางตัวก็เก่าจนไม่รู้ว่าต้องใช้ version อะไรในการรัน project สุดท้ายต้องไปควานหา version จาก code บ้าง ไม่ก็จาก dockerfile หรือ pipeline ที่ใช้ build ซึ่งบางที่ก็ค่อนข้างจะใช้เวลานาน ก็เลยเป็นที่มาในการเขียนบทความนี้ขึ้นมาครับ เผื่อจะช่วยลดปัญหาเหล่านี้ลงไปบ้าง

repo เยอะจังโว้ยยยยย
มาลองใช้กันดีกว่า
แต่ก่อนจะใช้ก็ต้องติดตั้งก่อน ซึ่งถ้าใช้ macOS ก็ง่ายเลย ลงผ่าน brew แต่ถ้าใช้ผ่าน docker ที่เป็น linux หรืออื่นๆ ก็ลงผ่าน git ได้เหมือนกัน (ลองดูตาม **Docs** ได้เลย)
brew install asdf
หลังจาก install เสร็จก็ต้องมี setup นิดนึงตามที่เค้าแนะนำเลย ซึ่งถ้าใช้ zsh ก็เอาข้างล่างนี้ไปไว้ที่ shell profile เลย

after brew install asdf
แต่ถ้าใน docs ก็จะมีแนะนำเยอะเลย ตาม shell ที่ใช้อยู่ได้เลย ซึ่งใน docs มีเยอะมาก แต่ผมใช้ zsh และลงผ่าน homebrew ก้จะทำ brew บอกต่อเลย และเอาไปไว้ที่ .zshrc ซึ่งถ้าใช้ oh-my-zsh ด้วยก็ add เข้า plugin ด้วยเลยก็ดี จะได้มี completion ให้ใช้ด้วย
#add to ~/.zshrc
. /opt/homebrew/opt/asdf/libexec/asdf.sh
หลังจากทำเสร็จก็ลอง restart shell ดู แล้วลอง run cmd ได้เลย

ถึงเวลาใช้งานจริงๆละ
จะขอแบ่งเป็น 2 ส่วนของการใช้งาน แล้วก็จะตามด้วยการทำไฟล์ lock version ไว้เพื่อ auto switch version จากการเปิด project นั้นๆ และก็แถม extension ใน vscode เพื่อความสะดวก ซึ่งก็ชื่อ asdf ชื่อเดียวกันเลย
- ส่วนแรกคือเริ่มใช้จากศูนย์เลย ไม่เคยใช่ version manager อะไรมาก่อน หรือ ไม่เคย install ภาษาต่างๆมาก่อน อันนี้จะง่ายหน่อย ทำตาม docs ได้เลย
- อีกส่วนคือเริ่มใช่จากการ migrate จากตัวเก่าๆ ที่เคยใช้อยู่แล้วเช่น nvm อันนี้จะยากนิดนึงต้องไปไล่ปิด tools เก่าๆ หรือ env ที่อาจจะทำให้ cmd ของภาษานั้นๆ ชนกันอยู่เพื่อ switch มาใช้ของ asdf แทน
แต่ก่อนจะใช้เป็น version manager เราสามารถใช้เป็นตัวติดตั้ง tools คล้ายๆ homebrew ก็ได้นะ เช่นอยากจะลง golang แต่ขี้เกียจลงผ่าน official ก็ใช้ asdf แทนได้แต่ต้อง add plugin ก่อน แต่ถ้าไม่รู้ว่ามี plugin อะไรให้ใช้บ้าง ก็ list ออกมาดูได้เลย ด้วย
asdf plugin list all

อันไหนมี คือ add ไว้แล้ว*
และใช้ cmd `asdf plugin add <name> [<git-url>]`` โดยใน docs ของ plugin จะบอกวิธีอยู่คล้ายๆข้างล่างนี้ ซึ่งถ้า plugin อื่นๆก็อาจจะมีวิธีคล้ายๆกัน แต่อาจจะมีวิธี setup อย่างอื่นเพิ่มเติมด้วย ลองเข้าไปดูก่อนก็ดีครับ
asdf plugin add golang https://github.com/asdf-community/asdf-golang.git
#หรือจะใช้แค่ add golang โดยไม่ใส่ git-url ก็ได้เหมือนกัน
asdf plugin add golang
หลังจาก add ก็ยังใช้ golang ไม่ได้นะ ต้องติดตั้งก่อนด้วย cmd asdf install <name> <version> โดยถ้าจะใช้ version ล่าสุดก็ใส่ latest ไปได้เหมือนกัน แล้วก็ set global version เพื่อใช้งานต่อได้เลย (แรกๆอาจจะยุ่งยากหน่อยนึง)

cmd ไว้ใช้ manage package
asdf install golang latest #install latest version
asdf global golang latest #set global version to latest
ทีนี้ก็ใช้ golang ได้แล้ว ซึ่ง asdf จะทำการสร้าง file .tool-versionsไว้ที่ ~ หรือ $HOME เพื่อเก็บว่า set global version อะไรอยู่บ้าง
แล้วถ้าอยากจะให้แต่ละ project ใช้ version ที่แตกต่างกันก็ install version ที่ต้องการ แล้วก็ใช้ cmd asdf local <name> <version> เพื่อ set version นั้นๆไว้ใน project (ไฟล์ .tool-versions นั่นเอง)แล้วเอาขึ้น git ไปด้วยได้เลย เพื่อจะเอาไว้ใช้กับ CI/CD ก็ได้เหมือนกัน
แล้วเรายังสามารถ manage version ของ tools อื่นๆใน project ได้เช่นกัน เช่น go project ใช้ golangci-lint หรือ ginkgo อยู่ก็ทำได้เหมือนกัน (ก็แล้วแต่ plugin ของ asdf จะ support)
asdf local golang latest
#อย่าลืม add plugin และ install ก่อนนะ
asdf local ginkgo latest
asdf local golangci-lint latest

หลังจาก set local version ก็จะมี file .tool-versions เกิดขึ้นใน project
ทีนี้แค่เราเปิด project หรือ cd เข้าไปที่ project ด้วย shell เจ้า asdf นี่ก็จะ switch version ให้เราอัตโนมัติเลย
แต่ก็ถ้าเรามี .tool-versions อยู่แล้วใน project อื่น แต่ในเครื่องเราไม่ได้ติดตั้ง plugin หรือ version นั้นๆไว้ เราก็เพียงแค่รันคำสั่ง asdf install ได้เลย ถ้าในเครื่องเรามี plugin ใน list นั้นครบแล้ว แต่ขาดบาง version เดี๋ยว asdf จะติดตั้งให้เอง

asdf install but plugin is not add
เอาจริงๆ แค่นี้ก็จบแล้วนะ สามารถใช้งานได้แล้ว ขอบคุณที่อ่านมาถึงตรงนี้ครับ

แต่เดี๋ยวก่อน asdf ยังสามารถทำอะไรได้มากกว่านั้น
ถ้าคุณใช้ version manager ตัวอื่นๆอยู่ด้วยนั้น asdf ก็ backward compat นะ (แต่ก็ไม่ใช่ทุกตัวหรอก ใน docs เห็นว่ามี node กับ ruby) เพียงแค่ไปเพิ่ม config ในไฟล์ .asdfrc แค่ 1 config แค่นี้ก็จะสามารถใช้ asdf โดย auto switch version จาก ไฟล์ .nvmrc หรือ .ruby-version ได้เลย (ส่วนตัวเคยใช้แค่ nvm แต่ก็โอเคเลยนะ)
legacy_version_file = yes
แล้วเราก็สามารถเช็คด้วยคำสั่ง asdf current ได้ด้วยนะว่าตอนนี้ใช้ version อะไรอยู่จาก globla หรือ local หรือ legacy ไฟล์

แต่ถ้า node version นี้ ไม่ได้ติดตั้งไว้ในเครื่องก็ใช้ asdf install ได้เลยเช่นกัน แต่ไหนๆก็ install แล้ว ก็ migrate ไฟล์ใช้ .tool-versions ของ asdf เลยก็ดีนะครับ ฮ่าๆ
แต่บางที version manager อันอื่นเช่น gvm ของ golang ถ้าเราลง go ไว้แล้ว ย้ายมาใช้ asdf แทน ก็อาจจะยังมีอะไรเอ๋อๆพังๆ อยู่บ้าง อาจจะต้องไปปิดการใช้งาน หรือลบทิ้งไปเลย โดยส่วนตัวก็เจอเหมือนกันว่า เคยลง go จาก gvm แล้วย้ายมา asdf ตอนแรก ก็งงว่า ทำไม version ไม่เป็นอันใหม่ที่เพิ่งติดตั้งไป จนต้องใช้คำสั่ง which <name> เพื่อไปหาว่าใช้จากของอะไรอยู่ แล้วก็ไปลบมันทิ้ง หรือ unlink ออกจาก homebrew เหมือนกัน
ของแถมสำหรับคนใช้ vscode เราสามารถลง extension ชื่อ asdf เพื่อใช้งานแบบง่ายๆได้ด้วยนะ

ง่ายขนาดที่ว่าเราสามารถใช้งาน โดยไม่ต้องพิมพ์คำสั่งใดๆก่อนหน้านี้เลยก็ได้ สามารถ add plugin, ติดตั้ง package, หรือ set version ได้ทั้ง local และ global รวมไปถึง ลบ package ที่ไม่ได้ใช้ออกไปได้เลย (ง่ายจริงๆนะ ขอย้ำอีกที) ลองไปเล่นๆดูได้ครับ

ก็เป็นอันจบไปที่เรียบร้อย จริงๆก็ไม่ได้เขียน blog นานแล้วเหมือนกัน ยังมี tools อีกหลายๆตัว ที่อยากแชร์ เหมือนกันเช่น openlens, kube-forwarder หรือ ไว้ถ้ามีโอกาสจะกลับมาเขียนใหม่ครับ
ปล. เหมือนจะลืมแปะวาร์ป เอาไว้ตรงนี้ละกัน https://asdf-vm.com/
ปล2. สำหรับคนใช้ golang ถ้าเจอว่า asdf ไปใช้ version จาก go.mod ให้เพิ่ม env ASDF_GOLANG_MOD_VERSION_ENABLED ไปใน shell profile ได้เลย
#.zshrc
export ASDF_GOLANG_MOD_VERSION_ENABLED=false 메타데이터
- post_id
- 51ca564bb6ac
- slug
- asdf-รวบตึงทุก-version-manager-มาไว้ในตัวเดียว-51ca564bb6ac
- url
- https://medium.com/tonpc/asdf-%E0%B8%A3%E0%B8%A7%E0%B8%9A%E0%B8%95%E0%B8%B6%E0%B8%87%E0%B8%97%E0%B8%B8%E0%B8%81-version-manager-%E0%B8%A1%E0%B8%B2%E0%B9%84%E0%B8%A7%E0%B9%89%E0%B9%83%E0%B8%99%E0%B8%95%E0%B8%B1%E0%B8%A7%E0%B9%80%E0%B8%94%E0%B8%B5%E0%B8%A2%E0%B8%A7-51ca564bb6ac
- canonical_url
- https://medium.com/tonpc/asdf-%E0%B8%A3%E0%B8%A7%E0%B8%9A%E0%B8%95%E0%B8%B6%E0%B8%87%E0%B8%97%E0%B8%B8%E0%B8%81-version-manager-%E0%B8%A1%E0%B8%B2%E0%B9%84%E0%B8%A7%E0%B9%89%E0%B9%83%E0%B8%99%E0%B8%95%E0%B8%B1%E0%B8%A7%E0%B9%80%E0%B8%94%E0%B8%B5%E0%B8%A2%E0%B8%A7-51ca564bb6ac
- author_url
- https://medium.com/@tonpc64
- status
- ok
- fetched_at
- 2026-07-22 18:48:22