स्विफ्ट पैकेज को हल करने के लिए एक्सकोड और गिट के बीच अंतर


10

तो पृष्ठभूमि यह है: मेरे पास एक एक्सकोड परियोजना है जो स्विफ्ट पैकेज पर निर्भर करती है जो कि जीथब पर एक निजी भंडार में है। बेशक, इसे एक्सेस करने के लिए एक कुंजी की आवश्यकता होती है। अब तक, मैं CI को ऐसे कॉन्फ़िगर करने में कामयाब रहा हूं कि मैं उदाहरण के लिए और git cloneस्विफ्ट पैकेज के लिए आवश्यक रिपॉजिटरी में ssh कर सकता हूं । दुर्भाग्य से जब यह xcbuildCI के साथ चल रहा है, तो यह काम नहीं करता है और मुझे यह संदेश मिलता है:

static:ios distiller$ xcodebuild -showBuildSettings -workspace ./Project.xcworkspace \
    -scheme App\ Prod
Resolve Package Graph
Fetching git@github.com:company-uk/ProjectDependency.git
xcodebuild: error: Could not resolve package dependencies:
  Authentication failed because the credentials were rejected

इसके विपरीत, git cloneखुशी से इस रेपो को यहां देखा जाएगा:

static:ios distiller$ git clone git@github.com:company-uk/ProjectDependency.git
Cloning into 'ProjectDependency'...
Warning: Permanently added the RSA host key for IP address '11.22.33.44' to the list of known hosts.
remote: Enumerating objects: 263, done.
remote: Counting objects: 100% (263/263), done.
remote: Compressing objects: 100% (171/171), done.
remote: Total 1335 (delta 165), reused 174 (delta 86), pack-reused 1072
Receiving objects: 100% (1335/1335), 1.11 MiB | 5.67 MiB/s, done.
Resolving deltas: 100% (681/681), done.

थोड़ा और संदर्भ के लिए, यह GitHub पर एक तैनात कुंजी के साथ सेट की गई सर्कलसीआई पर चल रहा है, जिसे सीआई पर नौकरी में जोड़ा गया है।

एक्सकोड निर्भरता लाने की कोशिश करने के तरीके और वेनिला गिट के तरीके के बीच क्या अंतर हो सकता है, इसके बारे में कोई सुझाव महान होगा। धन्यवाद।


मैं वर्तमान में अपने CI के रूप में GitHub Actions के साथ एक ही मुद्दा रहा हूँ
22

उत्तर नहीं है, लेकिन कभी-कभी अतीत में (विशेष रूप से Xcode 10), गिट प्रमाणीकरण विवरण में बिना किसी कारण के गायब होने की प्रवृत्ति थी (शुरुआत में ठीक है, फिर pooof)। Xcode 11 को हल करता है।
एलेक्स

जवाबों:


6

यह SSH के साथ Xcode 11 में एक बग प्रतीत होता है। स्विफ्ट पैकेज को हल करने के लिए HTTPS पर स्विच करना समस्या को हल करता है:

तो इस से:

E29801192303068A00018344 /* XCRemoteSwiftPackageReference "ProjectDependency" */ = {
        isa = XCRemoteSwiftPackageReference;
        repositoryURL = "git@github.com:company-uk/ProjectDependency.git";
        requirement = {
                branch = "debug";
                kind = branch;
        };
};

सेवा:

E29801192303068A00018344 /* XCRemoteSwiftPackageReference "ProjectDependency" */ = {
        isa = XCRemoteSwiftPackageReference;
        repositoryURL = "https://github.com/company-uk/ProjectDependency.git";
        requirement = {
                branch = "debug";
                kind = branch;
        };
};

यह स्थानीय बिल्ड के लिए काम करता है, लेकिन CI मशीनों का नहीं, जहां आप किसी भी चीज में Xcode साइन नहीं कर सकते। यह हमेशा Xcode: xcodebuild: त्रुटि: से इस त्रुटि का परिणाम देता है पैकेज निर्भरता को हल नहीं कर सका: प्रमाणीकरण विफल रहा क्योंकि कोई क्रेडेंशियल्स प्रदान नहीं किए गए थे। मेरा अनुभव है कि SSH संस्करण काम करता है यदि आपकी ssh कुंजी ~ / .ssh और GitHub में सही ढंग से कॉन्फ़िगर की गई है। जब तक आप Xcode में GitHub में साइन इन हैं।
bscothern 17

यह मेरे लिए CI पर काम कर रहा है; मैं सोमवार तक कार्यालय में नहीं हूँ इसलिए जाँच नहीं कर सकता कि कैसे, लेकिन यह निश्चित रूप से काम कर रहा है।
चूहाबीम

4

CI पाइपलाइनों के लिए जहां आप GitHub या अन्य रिपॉजिटरी होस्ट में प्रवेश नहीं कर सकते हैं, यह वह समाधान है जो मैंने पाया कि निजी स्विफ्ट पैकेजों के आसपास Xcode के प्रतिबंधों / बगों को बायपास करता है।

निजी निर्भरता के लिए https urls का उपयोग करें क्योंकि ssh config वर्तमान में xcodebuild द्वारा अनदेखा किया जाता है, भले ही दस्तावेज़ अन्यथा कहता है।

एक बार जब आप स्थानीय रूप से https के साथ अपने रिपॉजिटरी होस्ट पर जा सकते हैं और व्यक्तिगत एक्सेस टोकन (PAT) बना सकते हैं। GitHub के निर्देश यहां दिए गए हैं

अपने CI सिस्टम के साथ इस PAT को एक गुप्त पर्यावरण चर के रूप में जोड़ें। नीचे दी गई स्क्रिप्ट में इसे निम्न के रूप में संदर्भित किया गया है GITHUB_PAT

फिर चलाने से पहले अपने CI पाइपलाइन में xcodebuildसुनिश्चित करें कि आप इस बैश स्क्रिप्ट का उचित रूप से संशोधित संस्करण चलाते हैं:

for FILE in $(grep -Ril "https://github.com/[org_name]" .); do
    sed -i '' "s/https:\/\/github.com\/[org_name]/https:\/\/${GITHUB_PAT}@github.com\/[org_name]/g" ${FILE}
done

यह स्क्रिप्ट सभी https संदर्भों को खोजेगी और PAT को इसमें इंजेक्ट करेगी ताकि इसका उपयोग पासवर्ड के बिना किया जा सके।

मत भूलना:

  • [org_name]अपने संगठन का नाम बदलें ।
  • ${GITHUB_PAT}यदि आपने इसे अलग तरह से नाम दिया है तो अपने सीआई सीक्रेट के नाम से बदलें ।
  • grepस्क्रिप्ट द्वारा संशोधित किसी भी पथ को अनदेखा करने के लिए कमांड को कॉन्फ़िगर करें ।

1
हाँ हाँ हाँ! यह मेरे लिए काम करता है जब कुछ नहीं किया! 2 दिन इस मुद्दे पर लड़ना! शायद यह समय की बात होगी जब तक कि Xcode SSH के साथ काम नहीं करता है, लेकिन अभी के लिए यह वर्कअराउंड करना होगा।
नूनो गोंकोल्वेस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.