ไลบรารีโปรแกรมยอดนิยมตีความแนวทาง macOS ผิด บังคับให้เครื่องมือ CLI ไปอยู่ในไดเร็กทอรีที่ผิด

ทีมชุมชน BigGo
ไลบรารีโปรแกรมยอดนิยมตีความแนวทาง macOS ผิด บังคับให้เครื่องมือ CLI ไปอยู่ในไดเร็กทอรีที่ผิด

การถกเถียงที่เพิ่มขึ้นในชุมชนนักพัฒนาได้เกิดขึ้นเกี่ยวกับว่าเครื่องมือ command-line ควรเก็บไฟล์การกำหนดค่าไว้ที่ไหนใน macOS ไลบรารีโปรแกรมยอดนิยมหลายตัวกำลังวางไฟล์การกำหนดค่า CLI ใน ~/Library/Application Support อย่างไม่ถูกต้อง ทำให้เกิดความหงุดหงิดในหมู่นักพัฒนาที่คาดหวังให้ไฟล์เหล่านี้ปฏิบัติตาม XDG Base Directory Specification และอยู่ใน ~/.config

ปัญหานี้เกิดจากไลบรารีที่ใช้กันอย่างแพร่หลายที่กำหนดไดเร็กทอรีการกำหนดค่าเฉพาะแพลตฟอร์ม แพ็กเกจ platformdirs ของ Python (ดาวน์โหลด 242 ล้านครั้งต่อเดือน), env-paths ของ JavaScript (ดาวน์โหลด 95 ล้านครั้งต่อเดือน), dirs crate ของ Rust (ดาวน์โหลด 4.8 ล้านครั้งต่อเดือน) และแพ็กเกจ adrg/xdg ของ Go ทั้งหมดใช้ค่าเริ่มต้นเป็น ~/Library/Application Support บน macOS สิ่งนี้ส่งผลกระทบต่อเครื่องมือ command-line หลายร้อยตัวที่พึ่งพาไลบรารีเหล่านี้สำหรับการจัดการการกำหนดค่า

ไลบรารียอดนิยมที่ใช้ไดเรกทอรีผิด:

  • Python's platformdirs : ดาวน์โหลด 242 ล้านครั้งต่อเดือน
  • JavaScript's env-paths : ดาวน์โหลด 95 ล้านครั้งต่อเดือน
  • Rust's dirs crate : ดาวน์โหลด 4.8 ล้านครั้งต่อเดือน
  • Go's adrg/xdg package : ถูกใช้งานใน 913 แพ็กเกจ

รากเหง้าของปัญหา

ความสับสนเกิดจากการตีความแนวทาง macOS Standard Directories ของ Apple อย่างผิดๆ แนวทางเหล่านี้อ้างถึงแอปโดยเฉพาะ - ซึ่งใน macOS หมายถึง Application Bundles ที่มีส่วนขยาย .app, bundle identifiers และข้อกำหนดการติดตั้งเฉพาะ เครื่องมือ command-line แตกต่างจากแอปโดยพื้นฐานและไม่มีลักษณะเหล่านี้

เอกสารของ Apple ระบุอย่างชัดเจนว่า Application Support ควรมีไฟล์ที่แอปสร้างและจัดการในนามของผู้ใช้ และควรจัดระเบียบโดยใช้ bundle identifiers เนื่องจากเครื่องมือ CLI ไม่มี bundle identifiers และไฟล์การกำหนดค่าของพวกมันมักจะถูกแก้ไขด้วยมือโดยผู้ใช้ จึงไม่เข้าข่ายหมวดหมู่นี้

ความคาดหวังของนักพัฒนา vs ความเป็นจริง

ความหงุดหงิดของชุมชนเห็นได้ชัดในการอภิปรายที่กำลังดำเนินอยู่รอบๆ ไลบรารียอดนิยม นักพัฒนา Rust ได้ขอให้เปลี่ยนแปลง dirs crate หลายครั้ง แต่ผู้ดูแลปฏิเสธที่จะรองรับมาตรฐาน XDG บน macOS สิ่งนี้ทำให้นักพัฒนาบางคนละทิ้งไลบรารีไปเลย สร้างโซลูชันแบบกำหนดเองที่ใช้ข้อกำหนด XDG อย่างถูกต้องข้ามแพลตฟอร์ม

ในฐานะผู้ใช้ใหม่ มันน่าแปลกใจมากสำหรับฉันที่เครื่องมือสมัยใหม่อย่าง nu จะใส่ไฟล์การกำหนดค่าไว้ใต้ Application Support บน macOS มันยิ่งน่าแปลกใจกว่านั้นที่เห็นว่าบางคนต่อต้านการใช้มาตรฐาน XDG อย่างแข็งขัน

ความคาดหวังสำหรับ ~/.config ไม่ใช่เรื่องเอาแต่ใจ - มันอิงจากความสอดคล้องกับระบบ Unix-like อื่นๆ และความจริงที่ว่า macOS เป็นระบบปฏิบัติการ Unix ที่ได้รับการรับรอง แม้แต่เครื่องมือ command-line ของ Apple เอง เช่น bash, zsh, git และ vim ก็ปฏิบัติตามแบบแผน Unix แบบดั้งเดิมสำหรับการวางไฟล์การกำหนดค่า

เครื่องมือจัดการ Dotfile เผยความต้องการของผู้ใช้

เครื่องมือจัดการ dotfile ยอดนิยมให้ข้อมูลเชิงลึกเกี่ยวกับพฤติกรรมจริงของผู้ใช้ เครื่องมืออย่าง chezmoi (14.3k ดาวบน GitHub), dotbot (7.3k ดาว) และ yadm (5.5k ดาว) ไม่พยายามรองรับ ~/Library/Application Support โดยค่าเริ่มต้น แม้จะรวมการกำหนดค่าเฉพาะ macOS ไว้ด้วย สิ่งนี้บ่งชี้ว่าผู้ใช้ส่วนใหญ่คาดหวังและจัดการการกำหนดค่า CLI ของพวกเขาในตำแหน่ง Unix มาตรฐาน

จำนวน GitHub Stars ของเครื่องมือจัดการ Dotfile:

  • chezmoi: 14.3k ดาว
  • dotbot: 7.3k ดาว
  • yadm: 5.5k ดาว
  • rcm: 3.2k ดาว

โซลูชัน XDG

XDG Base Directory Specification เสนอโซลูชันที่สะอาดซึ่งทำงานข้ามระบบ Unix-like รวมถึง macOS มันให้ตำแหน่งมาตรฐานสำหรับการกำหนดค่า ($XDG_CONFIG_HOME), cache ($XDG_CACHE_HOME) และไฟล์ข้อมูล พร้อมค่าเริ่มต้นที่สมเหตุสมผลเมื่อไม่ได้ตั้งค่าตัวแปรสภาพแวดล้อม

นักพัฒนาบางคนได้พบวิธีแก้ปัญหาโดยใช้ไลบรารีทางเลือกอย่าง etcetera crate ใน Rust ซึ่งใช้มาตรฐาน XDG ทั้งบน Linux และ macOS โดยค่าเริ่มต้น คนอื่นๆ ได้สร้างการใช้งานแบบกำหนดเองที่เคารพตัวแปรสภาพแวดล้อม XDG เมื่อมีการตั้งค่าไว้ ให้ผู้ใช้ควบคุมการวางตำแหน่งการกำหนดค่าของพวกเขา

การใช้ไดเรกทอรีการกำหนดค่าที่ถูกต้อง:

  • เครื่องมือ CLI: ควรใช้ ~/.config (ข้อกำหนด XDG )
  • แอป GUI ใน /Applications: สามารถใช้ ~/Library/Application Support
  • การตั้งค่า macOS: ควรใช้ ~/Library/Preferences กับ NSDefaults API

การก้าวไปข้างหน้า

โซลูชันไม่ซับซ้อน - เครื่องมือ command-line ควรปฏิบัติตามข้อกำหนด XDG โดยใช้ค่าเริ่มต้นเป็น ~/.config สำหรับไฟล์การกำหนดค่าบนระบบ Unix-like รวมถึง macOS สำหรับแอปพลิเคชัน GUI ที่ติดตั้งใน /Applications ที่จัดการการกำหนดค่าโดยอัตโนมัติ ~/Library/Application Support ยังคงเหมาะสม

การถกเถียงนี้เน้นย้ำปัญหาที่กว้างขึ้นในการพัฒนาข้ามแพลตฟอร์ม: ความสำคัญของการเข้าใจแนวทางเฉพาะแพลตฟอร์มในบริบทที่เหมาะสมแทนที่จะนำไปใช้กับซอฟต์แวร์ทุกประเภทอย่างไม่คิด ขณะที่ชุมชนนักพัฒนายังคงผลักดันเพื่อความสอดคล้องและค่าเริ่มต้นที่เป็นมิตรต่อผู้ใช้ ผู้ดูแลไลบรารีอาจต้องพิจารณาการใช้งานปัจจุบันของพวกเขาใหม่เพื่อตอบสนองความต้องการที่แท้จริงของผู้ใช้ได้ดีขึ้น

อ้างอิง: macOS dotfiles should not go in ~/Library/Application Support