ลองจินตนาการว่าคุณเป็นเชฟมือหนึ่ง เพื่อให้แน่ใจว่าร้านอาหารในเครือของคุณทั้งหมดสามารถปรุงอาหารที่อร่อยเหมือนกันได้ คุณจึงได้พัฒนาซีรีส์ “ซอสลับ” ขึ้นมา คุณต้องการส่งซอสเหล่านี้ไปยังแต่ละสาขา แต่คุณไม่สามารถปล่อยให้คนเดินถนนทั่วไปหยิบมันไปได้
ในโลกของการพัฒนาซอฟต์แวร์ ซอสลับเหล่านี้ก็คือ “Private Package” ภายในบริษัท นั่นเอง
เมื่อโปรเจกต์มีจำนวนมากขึ้น คุณน่าจะเคยพบกับความหงุดหงิดจากการต้องคัดลอกและวาง UI คอมโพเนนต์ หรือฟังก์ชันยูทิลิตี้เดิมๆ ซ้ำไปซ้ำมาในทุกโปรเจกต์ หรือต้องดิ้นรนกับ Git Submodule จนเริ่มตั้งคำถามกับชีวิต อันที่จริง สิ่งที่คุณต้องการก็คือ “ห้องเก็บอาหารส่วนตัว (Private NPM Registry)” เท่านั้น วันนี้เราจะมาคุยกันถึงวิธีใช้ pnpm เพื่อเผยแพร่ Package ไปยัง GitLab เพื่อให้สมาชิกในทีมสามารถติดตั้งได้เหมือนกับ Package โอเพนซอร์สทั่วไปด้วยคำสั่งเพียงบรรทัดเดียว
ทำไมต้องมี Private Package และ Scope?
ในจักรวาลของ Node.js แพ็กเกจส่วนตัวต้องมี “นามสกุล” ซึ่งก็คือ Scope (ขอบเขต) นั่นเอง
ตัวอย่างเช่น หากบริษัทของคุณชื่อ @my-company ชื่อแพ็กเกจของคุณอาจดูเหมือน @my-company/ui-kit ด้วยนามสกุลนี้ เมื่อ pnpm เห็นแพ็กเกจ มันจะไม่ค้นหาใน npmjs.org อย่างไร้จุดหมาย แต่จะมุ่งตรงไปยังพิกัดของบริษัทที่คุณระบุไว้แทน
การตัดสินใจครั้งสำคัญ: Group Level vs. Project Level
ใน GitLab สิ่งนี้เหมือนกับการตัดสินใจว่าจะเก็บเครื่องปรุงไว้ที่ไหน:
| ระดับ | คำอธิบาย |
|---|---|
| Project Level (ระดับโปรเจกต์) | เหมือนตู้เซฟส่วนตัวของเชฟ ใช้ได้เฉพาะกับอาหารบางเมนูเท่านั้น การตั้งค่าค่อนข้างยุ่งยาก เนื่องจากแต่ละแพ็กเกจต้องมีการกำหนดค่าแยกกัน |
| Group Level (ระดับกลุ่ม) | นี่คือแนวคิดของ “ครัวกลาง” ซึ่งขอแนะนำเป็นอย่างยิ่ง! ตั้งค่าเพียงครั้งเดียว แพ็กเกจหลายสิบหรือหลายร้อยรายการภายใต้กลุ่มเดียวกันก็สามารถใช้การตั้งค่าและข้อมูลประจำตัวร่วมกันได้ |
การตั้งค่า “พาสปอร์ต”: Access Token และตัวแปรสภาพแวดล้อม
ในการเข้าสู่คลังเสบียงใต้ดิน คุณต้องได้รับ “การ์ดผ่านทาง” เสียก่อน
- ไปที่ Settings > Access Tokens ใน GitLab
- ขอ Token โดยระบุสิทธิ์
read_api(สำหรับการดาวน์โหลด) และwrite_package_registry(สำหรับการเผยแพร่) - สำคัญ: เมื่อได้รับ Token มาแล้ว อย่าใส่รหัสลงในโค้ดหรือไฟล์
.npmrcโดยตรง! นั่นเหมือนกับการเสียบกุญแจห้องนิรภัยทิ้งไว้ที่ประตู
วิธีที่เป็นมืออาชีพที่สุดคือการซ่อนไว้ใน “ตัวแปรสภาพแวดล้อม (Environment Variables)” เพิ่มบรรทัดนี้ในเทอร์มินัล Mac หรือ Linux ของคุณ (เช่น ~/.zshrc):
export GITLAB_TOKEN="GitLab_Token_ของคุณ"
ด้วยวิธีนี้ ระบบจะแนบข้อมูลประจำตัวให้คุณโดยอัตโนมัติ ทำให้ทั้งปลอดภัยและสะดวกสบาย
การตั้งค่าการนำทาง: หัวใจสำคัญของ .npmrc
ลำดับถัดไป เราจะสร้างแผนที่นำทาง .npmrc ในรูทของโปรเจกต์เพื่อบอก pnpm ว่าต้องไปที่ไหน:
# สำหรับอะไรก็ตามที่ขึ้นต้นด้วย @my-company ให้ไปที่ GitLab
@my-company:registry=https://gitlab.com/api/v4/groups/<YOUR_GROUP_ID>/-/packages/npm/
# ตั้งค่าการรับรองความถูกต้องด้วยการ์ดผ่านทาง (อ่านจากตัวแปรสภาพแวดล้อมที่เราเพิ่งตั้งค่าไว้)
//gitlab.com/api/v4/groups/<YOUR_GROUP_ID>/-/packages/npm/:_authToken="${GITLAB_TOKEN}"
เพียงแค่เปลี่ยน Group ID ของบริษัทคุณ ทางเดินก็จะถูกปูไว้รอแล้ว!
ขั้นตอนสุดท้ายก่อนการเผยแพร่: ศิลปะของการบรรจุหีบห่อ
หลายคนรีบเผยแพร่ทันทีหลังจากตั้งค่าการเชื่อมต่อ จนเผลออัปโหลดไฟล์ทดสอบหรือแม้แต่การกำหนดค่าที่เป็นความลับขึ้นไปด้วย นี่คือจุดที่ฟิลด์ files ใน package.json จะเข้ามาช่วยได้
นี่คือแนวคิดแบบ “Allowlist”:
{
"name": "@my-company/lib-1",
"files": [
"dist"
],
"publishConfig": {
"registry": "https://gitlab.com/api/v4/projects/<YOUR_PROJECT_ID>/packages/npm/"
}
}
| การตั้งค่า | คำอธิบาย |
|---|---|
files |
บอกระบบอย่างชัดเจนว่า ฉันต้องการเผยแพร่เฉพาะเนื้อหาที่คอมไพล์แล้วใน dist เท่านั้น โดยทิ้งส่วนอื่นๆ ไว้ข้างหลัง |
publishConfig |
นี่คือการประกันความปลอดภัยสองชั้น เพื่อให้มั่นใจว่าแพ็กเกจนี้จะไม่ถูกเผยแพร่สู่สาธารณะ (npmjs.org) โดยไม่ตั้งใจ |
ก่อนเผยแพร่ ขอแนะนำให้ใช้คำสั่ง pnpm pack เพื่อเปิดกล่องและตรวจสอบเนื้อหาในเครื่องก่อน เมื่อทุกอย่างเรียบร้อยดีแล้ว ให้รัน pnpm publish อย่างมั่นใจได้เลย!
บทสรุป
การสร้างห้องเก็บอาหารส่วนตัวไม่ใช่เรื่องยาก กุญแจสำคัญคือ:
- ขอ Token และป้องกันด้วยตัวแปรสภาพแวดล้อม
- กำหนดค่าแผนที่นำทาง
.npmrcให้ถูกต้อง - ใช้ฟิลด์
filesในpackage.jsonเพื่อการส่งมอบที่แม่นยำ
เมื่อเชี่ยวชาญเวิร์กโฟลว์นี้ คุณจะสามารถทำให้การนำโค้ดกลับมาใช้ใหม่ในบริษัทมีความเป็นมืออาชีพ ปลอดภัย และสง่างามได้ ตอนนี้ ไปสร้างครัวกลางของคุณเองกันเลย!