Homebrew 6.0 अपडेट के कारण अटके Mac ऑनबोर्डिंग स्क्रिप्ट को कैसे ठीक करें
29 juillet 2026
0
Computing/SoftwareComments (0)
Log in to leave a comment
No posts yet
Log in to leave a comment
No posts yet
जब मैं सुबह काम पर पहुँचा, तो देखा कि Slack पर नए कर्मचारियों की ऑनबोर्डिंग स्क्रिप्ट के अटक जाने के दर्जनों संदेश जमा थे। जब मैंने टर्मिनल खोला, तो पाया कि brew install प्रक्रिया के दौरान उपयोगकर्ता के इनपुट का इंतज़ार करते हुए स्क्रिप्ट पूरी तरह रुकी हुई थी।
Homebrew 6.0 में अपडेट के बाद, इंटरएक्टिव इंटरफ़ेस (Ask mode) और मानक इनपुट (stdin) को ब्लॉक करने की नीतियाँ सख्त कर दी गई हैं। जब कोई व्यक्ति खुद कमांड टाइप करता है तो कोई समस्या नहीं होती, लेकिन जब इसे शैल स्क्रिप्ट के ज़रिए बैकग्राउंड में चलाया जाता है, तो टर्मिनल इनपुट-आउटपुट के गतिरोध (deadlock) में फँस जाता है।
यदि टीम के सदस्यों के वातावरण सेटअप से जुड़े प्रश्नों के कारण आपके काम का प्रवाह भी बाधित हो रहा है, तो आपको स्क्रिप्ट में कुछ एनवायरनमेंट वैरिएबल और अपवाद नियंत्रण (exception handling) सीधे जोड़ने होंगे।
Homebrew 6.0 टीटीवाई (인터एक्टिव टर्मिनल) कनेक्शन के बिना पैकेज इंस्टॉल करते समय अप्रत्याशित इनपुट-आउटपुट प्रतीक्षा का कारण बनता है। टर्मिनल के अटकने की समस्या को रोकने और पूरी तरह से अनअटेंडेड (unattended) निष्पादन वातावरण बनाने के लिए, आपको स्क्रिप्ट के शीर्ष पर विशेष एनवायरनमेंट वैरिएबल्स को स्पष्ट रूप से निर्दिष्ट करना होगा।
स्क्रिप्ट के सबसे ऊपर निम्नलिखित वैरिएबल्स जोड़ने से एडमिनिस्ट्रेटर अनुमति अनुरोधों को छोड़कर सभी इंटरएक्टिव संकेत (prompts) और हिंट्स निष्क्रिय हो जाते हैं।
`bash
#!/usr/bin/env zsh
export NONINTERACTIVE=1
export HOMEBREW_NO_ENV_HINTS=1
export HOMEBREW_ACCEPT_OUTDATED_CAVEATS=1
export HOMEBREW_NO_AUTO_UPDATE=1
export HOMEBREW_NO_INSTALL_CLEANUP=1
if [[ -f "/opt/homebrew/bin/brew" ]]; then
eval "(/usr/local/bin/brew shellenv)"
else
/bin/bash -c "(/opt/homebrew/bin/brew shellenv)"
fi
safe_brew_install() {
local formula="{formula}" &>/dev/null; then
echo "이미 설치됨: {formula}"; then
echo "오류 발생: ${formula} 설치 실패" >&2
return 1
fi
fi
}
safe_brew_install "git"
safe_brew_install "jq"
`
.zshrc फ़ाइल के बजाय Homebrew की अंतर्निहित कॉन्फ़िगरेशन फ़ाइल brew.env का उपयोग करते समय, सिंटैक्स त्रुटि से बचने के लिए export कीवर्ड को हटाकर केवल HOMEBREW_NO_ENV_HINTS=1 के रूप में कुंजी-मूल्य (key-value) जोड़े लिखना चाहिए।
संस्करण 6.0 से, सप्लाई चेन सुरक्षा कारणों से 'Tap Trust Model' को डिफ़ॉल्ट रूप से लागू किया गया है। अप्रमाणित बाहरी कस्टम टैप या MD5, SHA-1 का उपयोग करने वाले पुराने पैकेज लोड होने से ही ब्लॉक हो जाते हैं।
आंतरिक टूल वितरण के लिए फ़ॉर्मूला में SHA-256 डाइजेस्ट लिखना अनिवार्य है, और CI/CD पाइपलाइन को क्रैश होने से बचाने के लिए इसे brew audit --strict जाँच को पास करना होगा।
`ruby
class InternalApiCli < Formula
desc "사내 인프라 API 제어 및 배포 자동화 CLI 도구"
homepage "https://internal.company.net/docs/cli"
url "https://internal.company.net/downloads/cli/v2.4.0/internal-api-cli-2.4.0.tar.gz"
sha256 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
license "Proprietary"
depends_on "jq"
def install
bin.install "internal-api-cli"
end
test do
assert_match "version 2.4.0", shell_output("#{bin}/internal-api-cli --version")
end
end
`
आंतरिक वितरण फ़ॉर्मूला (internal-api-cli.rb) फ़ाइल के अंदर SPDX मानक लाइसेंस पहचानकर्ता (license "Proprietary") और सटीक url, desc फ़ील्ड दर्ज करें। CI/CD पाइपलाइन में फ़ाइल डाउनलोड करने के बाद shasum -a 256 से मान निकालकर sed के साथ स्वचालित रूप से अपडेट करना सुविधाजनक होता है।
डेवलपर के लोकल Mac पर एक बार brew trust company/tools चलाने से आंतरिक Tap एक विश्वसनीय स्रोत के रूप में पंजीकृत हो जाता है और सुरक्षा चेतावनियों के बिना तुरंत इंस्टॉल हो जाता है।
यदि VS Code टर्मिनल या कोई पुराना टर्मिनल एमुलेटर Intel (x86_64) बाइनरी के रूप में चल रहा है, तो M सीरीज़ Mac का उपयोग करने के बावजूद uname -m का परिणाम x86_64 आएगा। इस स्थिति में Homebrew पैकेज इंस्टॉल करने पर, x86 बाइनरी /usr/local के तहत इंस्टॉल हो जाती हैं और mach-o file, but is an incompatible architecture त्रुटि देती हैं।
आपको यह जाँचने की आवश्यकता है कि क्या टर्मिनल वातावरण Rosetta 2 के अंतर्गत चल रहा है, और यदि ऐसा है, तो प्रक्रिया को तुरंत arm64 नेतिव में फिर से शुरू करने के लिए सशर्त कोड की आवश्यकता होगी।
`bash
#!/usr/bin/env zsh
SYSTEM_ARCH="(sysctl -n sysctl.proc_translated 2>/dev/null || echo "0")"
if [[ "{SYSTEM_ARCH}" == "x86_64" && "0" "{SYSTEM_ARCH}" == "x86_64" && "${IS_TRANSLATED}" == "0" ]]; then
HOMEBREW_PREFIX="/usr/local"
else
echo "지원하지 않는 아키텍처: ${SYSTEM_ARCH}" >&2
exit 1
fi
eval "{HOMEBREW_PREFIX}/bin/brew shellenv)"
`
जब कर्नेल पैरामीटर sysctl -n sysctl.proc_translated की जाँच की जाती है और यदि परिणाम 1 आता है, तो इसका मतलब है कि यह Rosetta 2 स्थिति में है। इस बिंदु पर, exec arch -arm64 /bin/zsh "$0" "$@" चलाने से पूरी स्क्रिप्ट arm64 शैल में स्विच हो जाती है और सही बाइनरी /opt/homebrew पाथ में इंस्टॉल हो जाती है।
यदि प्रत्येक डेवलपर के पास Homebrew का एक अलग संस्करण है और अलग-अलग पैकेज इंस्टॉल हैं, तो "यह मेरे कंप्यूटर पर काम करता है" जैसी स्थिति बार-बार उत्पन्न होती है। स्क्रिप्ट में डिक्लेरेटिव Brewfile और brew bundle check का संयोजन जोड़ने से नए कर्मचारियों को केवल एक कमांड से सेटअप पूरा करने की सुविधा मिलती है।
`bash
#!/usr/bin/env zsh
set -euo pipefail
export NONINTERACTIVE=1
export HOMEBREW_NO_ENV_HINTS=1
export HOMEBREW_BUNDLE_NO_UPGRADE=1
DOTFILES_REPO="https://github.com/company/dotfiles.git"
TARGET_DIR="$HOME/.dotfiles"
if ! command -v brew &>/dev/null; then
/bin/bash -c "(/opt/homebrew/bin/brew shellenv)"
fi
if [[ ! -d "{DOTFILES_REPO}" "{TARGET_DIR}" pull origin main
fi
BREWFILE_PATH="{BREWFILE_PATH}" &>/dev/null; then
echo "Brewfile의 모든 의존성이 최신 상태입니다."
else
brew bundle install --file="${BREWFILE_PATH}"
fi
`
आंतरिक Dotfiles रिपॉजिटरी को $HOME/.dotfiles में सिंक करने के बाद, पहले यह जाँच लें कि क्या brew bundle check का उपयोग करके कोई अनइंस्टॉल किया गया पैकेज मौजूद है। जब भी अनइंस्टॉल किए गए पैकेज हों, तभी brew bundle install चलाने से यह सुनिश्चित होता है कि स्क्रिप्ट को कई बार दोहराने के बावजूद समान वातावरण बनाए रखा जाता है।