मॉड्यूल पाठ (5/5)
बाधाएं और टैग बनाएं
बिल्ड बाधाएं (जिन्हें बिल्ड टैग भी कहा जाता है) ओएस, आर्किटेक्चर, गो संस्करण या कमांड लाइन पर पारित कस्टम टैग के आधार पर फ़ाइल के संकलन को गेट करते हैं। इनका उपयोग क्रॉस-प्लेटफ़ॉर्म कोड, ऑप्ट-इन हेवी टेस्ट फ़ाइलों और इसी तरह के परिदृश्यों के लिए किया जाता है।
आधुनिक वाक्यविन्यास: //go:build
गो 1.17+ के बाद से विहित प्रारूप विशेष //go:build टिप्पणी है, जिसे फ़ाइल के शीर्ष पर package से पहले, एक लाइन पर, उसके बाद एक खाली लाइन में रखा जाता है:
//go:build linux
package main
// this file is built ONLY on Linuxतीन पूर्ण नियम:
- टिप्पणी
packageसे पहले प्रदर्शित होनी चाहिए। - इसके बाद एक रिक्त पंक्ति होनी चाहिए।
//औरgo:buildके बीच कोई स्थान नहीं (यह एक वाक्यात्मक ट्रिगर है, केवल कोई टिप्पणी नहीं)।
बूलियन अभिव्यक्तियाँ
//go:build के बाद की अभिव्यक्ति तार्किक ऑपरेटरों को स्वीकार करती है:
//go:build linux && amd64 // both conditions
//go:build linux || darwin // any one (Unix-like)
//go:build !windows // negation
//go:build (linux || darwin) && !arm64
//go:build go1.22 // Go version ≥ 1.22
//go:build integration // custom tag (see below)सबसे आम अंतर्निर्मित टैग:
- ओएस:
linux,darwin,windows,freebsd,js... - आर्किटेक्चर:
amd64,arm64,386,wasm... - गो संस्करण:
go1.20,go1.22... (यदि संस्करण ** ≥** है तो सत्य है)। cgo: यदि cgo सक्षम है तो सत्य है।
क्रॉस-प्लेटफ़ॉर्म: फ़ाइल नाम कन्वेंशन
स्पष्ट टैग से परे, गो फ़ाइल नाम प्रत्यय को अंतर्निहित निर्माण बाधाओं के रूप में पहचानता है:
db_linux.go // linux only
db_windows.go // windows only
db_linux_amd64.go // linux/amd64 only
यह समान इंटरफ़ेस के प्लेटफ़ॉर्म-निर्भर कार्यान्वयन के लिए मुहावरेदार पैटर्न है (प्रत्येक फ़ाइल अलग-अलग कोड के साथ समान फ़ंक्शन को परिभाषित करती है)।
कस्टम टैग: भारी परीक्षणों में शामिल होना
कस्टम टैग कोई भी पहचानकर्ता है जिसे आप कमांड लाइन पर पास करते हैं:
//go:build integration
package mypkg
// tests that need a real DB, run only on demandकार्यान्वयन:
go test -tags=integration ./...-tags=integration के बिना, फ़ाइल कंपाइलर के लिए अदृश्य है (इसके अंदर के परीक्षण go test के लिए मौजूद नहीं हैं)। यह यूनिट परीक्षणों (हमेशा) को एकीकरण परीक्षणों (मांग पर, शायद केवल सीआई में) से अलग करने का विहित तरीका है।
पुराना सिंटैक्स: // +build (अप्रत्याशित)
1.17 से पहले प्रारूप // +build linux था (स्पेस नोट करें, और यह +build है, go:build नहीं)। यह अभी भी बैकवर्ड संगतता के लिए समर्थित है, लेकिन gofmt Go 1.17+ में दोनों जोड़ता है जब इसे केवल पुराना मिलता है:
//go:build linux
// +build linux
package mainनई फ़ाइलों के लिए केवल आधुनिक //go:build फॉर्म का उपयोग करें।
अभ्यास
फ़ाइल के शीर्ष पर बिल्ड बाधा जोड़ें जो इसे केवल लिनक्स पर संकलित करती है। पैकेज से पहले की खाली लाइन याद रखें.
संकेत दिखाएँ
//go:build टिप्पणी पैकेज से पहले जाती है, एक लाइन पर, उसके बाद एक खाली लाइन पर।
3 प्रयासों के बाद समाधान उपलब्ध है
एक बिल्ड बाधा जोड़ें जो विंडोज़ को बाहर कर दे (नेगेशन ऑपरेटर का उपयोग करें!)।
3 प्रयासों के बाद समाधान उपलब्ध है
परीक्षण के समय //go:build एकीकरण के साथ घोषित कस्टम 'एकीकरण' टैग को सक्षम करने के लिए, आप किस ध्वज का उपयोग करते हैं?
$ go test -tags=???