मैं लिनक्स पर कुछ एंट्री लेवल स्विफ्ट कोड लिख रहा हूं जो सीखने के अभ्यास के रूप में है।लिनक्स पर स्विफ्ट - तीसरे पक्ष के मॉड्यूल आयात करना
एक सामान्य कार्य के रूप में, मैं अपने कोड में किसी तृतीय-पक्ष स्विफ्ट मॉड्यूल का उपयोग करना चाहता हूं। आइए इस मॉड्यूल को "फू" कहते हैं। फू मॉड्यूल में एक पैकेज.swift फ़ाइल है, और उस निर्देशिका में swift build
चलाने के बाद, इसने .build/debug/libFoo.so
बनाया है।
अब मैं इस के साथ दो काम करने की इच्छा:
- आरईपीएल में
import Foo
करने में सक्षम हो। - शायद इस साझा ऑब्जेक्ट से लिंक करके, अपने स्वयं के स्विफ्ट प्रोग्राम में फू आयात करने में सक्षम हो।
मुझे लगता है कि दोनों कार्य संबंधित हैं, इसलिए अब वे एक ही प्रश्न में हैं।
1. के लिए, मुझे समझ में नहीं आता कि पैकेज कैसे आरईपीएल द्वारा 'खोजने योग्य' बन जाते हैं। मैंने swift -F .build/debug -framework Foo
की कोशिश की लेकिन मुझे "ऐसा कोई मॉड्यूल" त्रुटि नहीं मिली। मैंने उसी परिणाम के साथ swift -I .build/debug
भी कोशिश की।
2. के लिए, मैं swiftc --help
की जांच की और वहाँ -L
कर रहे हैं और -l
विकल्प हालांकि मैं सही तरीके से इन उपयोग करने के लिए खोजने के लिए सक्षम नहीं था: या तो स्विफ्ट
$ swiftc main.swift -L ../foo.git/.build/debug -llibFoo.so
main.swift:1:8: error: no such module 'Foo'
import Foo
^
मैं दोनों का उपयोग कर रहा/2.2 या 3.0 (का उपयोग swift build
के बजाय 2.2 के लिए किया गया है क्योंकि swift build
नहीं है - लेकिन यह वही आउटपुट उत्पन्न करता है जो मुझे विश्वास है)।
ध्यान दें कि मैं समझता हूं कि swift build
स्वचालित रूप से डाउनलोड और तृतीय पक्ष मॉड्यूल का निर्माण कर सकता है, हालांकि मैं जानना चाहता हूं कि ऑन-डिस्क मॉड्यूल को कैसे शामिल किया जाए क्योंकि वे मेरे स्वयं के कार्य-प्रगति मॉड्यूल हो सकते हैं।
संपादित करें: मैं एक खोज है कि आप कम से कम स्थानीय विकास के लिए पैकेज के dependencies:
सूची में url:
पैरामीटर के रूप में स्थानीय पथ का उपयोग कर सकते हैं, के आधार पर swift3 साथ एक छोटी सी प्रयोग करने की कोशिश की।
import PackageDescription
let package = Package(name: "Bar")
मैं भी Bar/Sources/bar.swift
बनाई युक्त:
public func bar(arg: Int) -> Int {
return arg * 2
}
मंशा है कि मॉड्यूल Bar
समारोह bar(arg:)
कहा जाता है प्रदान करता है
मैं एक निर्देशिका Bar
और Bar/Package.swift
बनाया।
मैं इस मॉड्यूल के लिए एक टैग किए गए स्थानीय Git रेपो बनाने के लिए एक git init
, git add .
, git commit -m "Initial commit."
और फिर git tag 1.0.0
किया था।
import PackageDescription
let package = Package(
name: "Foo",
dependencies: [ .Package(url: "../Bar", majorVersion: 1) ]
)
नोट ../Bar
के लिए रिश्तेदार पथ:
तो शीर्ष स्तर पर वापस मैं निर्देशिका Foo
और Foo/Package.swift
बनाया।
मैं भी Foo/Sources/main.swift
बनाया:
import Bar
print(bar(arg: 11))
अब जब मैं swift build
Foo
अंदर, यह Bar
क्लोन और यह बनाता है। हालांकि मुझे निम्न त्रुटि मिलती है; ऐसी कोई मॉड्यूल:
$ swift build
Compile Swift Module 'Foo' (1 sources)
Linking .build/debug/Bar
.../Foo/Sources/main.swift:3:7: error: use of unresolved identifier 'bar'
print(bar(arg: 11))
^~~
<unknown>:0: error: build had 1 command failures
error: exit(1): .../swift-3.0-PREVIEW-4-ubuntu14.04/usr/bin/swift-build-tool -f .../Foo/.build/debug.yaml
मैं आशा व्यक्त की थी कि इस काम हो सकता है:
$ swift build
Compile Swift Module 'Bar' (1 sources)
Compile Swift Module 'Foo' (1 sources)
.../Foo/Sources/main.swift:1:8: error: no such module 'Bar'
import Bar
^
<unknown>:0: error: build had 1 command failures
error: exit(1): .../swift-3.0-PREVIEW-4-ubuntu14.04/usr/bin/swift-build-tool -f .../Foo/.build/debug.yaml
अजीब तरह, अगर मैं ठीक उसी का निर्माण आदेश को फिर से करते हैं, मुझे कोई दूसरी त्रुटि मिलता है।
मैं आपके हालिया प्रयासों के साथ समस्याओं को पुन: उत्पन्न नहीं कर सका: मैंने आपके द्वारा वर्णित चरणों का पालन किया और 'फू' सफलतापूर्वक 'बार' आयात किया और 'बार' फ़ंक्शन कहा। एक और सवाल: आपने एक मॉड्यूल बनाने का प्रबंधन कैसे किया जिसने 'libFoo.so' लाइब्रेरी बनाई? जब मैंने आपके नवीनतम उदाहरण से 'बार' मॉड्यूल बनाया, तो '.build/debug' – OmniProg
@OmniProg में इसका प्रयास करने के लिए धन्यवाद' libBar.so' नहीं था। मुझे यकीन नहीं है कि यह आपके लिए क्यों काम करता है। मैं स्विफ्ट के एक अलग संस्करण के साथ प्रयास करेंगे। यह उत्साहजनक है कि यह आपके लिए काम करता है। आपके दूसरे बिंदु पर, मैंने फू/बार उदाहरण बनाने से पहले, मैं एक थर्ड-पार्टी मॉड्यूल के साथ काम कर रहा था जिसे 'बार' नहीं कहा गया था (इसे स्विफ्ट कहा जाता था) और यह libswifter.so फ़ाइल उत्पन्न करता था, लेकिन मैं चाहता था एक सामान्य के रूप में सवाल उठाने के लिए। मैंने धारणा की कि .so एक मानक आउटपुट था, लेकिन स्पष्ट रूप से यह नहीं है। मुझे स्विफ्ट में कुछ भी दिखाई नहीं दे रहा है जो बता सकता है कि यह क्यों उत्पन्न हुआ। इसलिए या तो। – meowsqueak
क्षमा करें, यह उल्लेख करना भूल गया कि मैं सटीक उसी संस्करण, स्विफ्ट-3.0-PREVIEW-4-ubuntu14.04 का उपयोग कर रहा हूं, इसलिए यह सभी व्युत्पन्न फ़ाइलों को साफ़ करने और स्क्रैच से पुनः प्रयास करने के लायक हो सकता है। – OmniProg