From cd53bf5bb605300617ab38e2f4a42f23cdd53940 Mon Sep 17 00:00:00 2001 From: Randy Reddig Date: Wed, 15 Sep 2021 09:27:21 -0700 Subject: [PATCH 1/2] example/swift-package: add Swift Package Manager example This depends on golang/mobile#70 (golang.org/cl/334689). --- example/swift-package/Makefile | 17 ++++++++++++ example/swift-package/Package.swift | 25 +++++++++++++++++ example/swift-package/README.md | 13 +++++++++ example/swift-package/Sources/GetGo/get.go | 22 +++++++++++++++ .../swift-package/Sources/GetKit/GetKit.swift | 1 + .../Tests/GetKitTests/GetTest.swift | 27 +++++++++++++++++++ 6 files changed, 105 insertions(+) create mode 100644 example/swift-package/Makefile create mode 100644 example/swift-package/Package.swift create mode 100644 example/swift-package/README.md create mode 100644 example/swift-package/Sources/GetGo/get.go create mode 100644 example/swift-package/Sources/GetKit/GetKit.swift create mode 100644 example/swift-package/Tests/GetKitTests/GetTest.swift diff --git a/example/swift-package/Makefile b/example/swift-package/Makefile new file mode 100644 index 000000000..aa108a519 --- /dev/null +++ b/example/swift-package/Makefile @@ -0,0 +1,17 @@ +.DEFAULT: build + +build: Frameworks $(wildcard Package.*) $(wildcard Sources/*/*) + swift build -c release + +.PHONY: Frameworks +Frameworks: Frameworks/GetGo.xcframework + +Frameworks/%.xcframework: Makefile $(wildcard Sources/*/*.go) $(shell which gomobile) + mkdir -p Frameworks + gomobile init + gomobile bind -target=ios,iossimulator,macos,maccatalyst -x -o $@ ./Sources/$* + touch $@ + +test: build + go test ./... + swift test diff --git a/example/swift-package/Package.swift b/example/swift-package/Package.swift new file mode 100644 index 000000000..b6d7229b8 --- /dev/null +++ b/example/swift-package/Package.swift @@ -0,0 +1,25 @@ +// swift-tools-version:5.3 +import PackageDescription + +let package = Package( + name: "GetKit", + products: [ + .library( + name: "GetKit", + targets: ["GetGo"] + ), + ], + targets: [ + .target( + name: "GetKit" + ), + .binaryTarget( + name: "GetGo", + path: "Frameworks/GetGo.xcframework" + ), + .testTarget( + name: "GetKitTests", + dependencies: ["GetKit", "GetGo"] + ), + ] +) diff --git a/example/swift-package/README.md b/example/swift-package/README.md new file mode 100644 index 000000000..607d233c7 --- /dev/null +++ b/example/swift-package/README.md @@ -0,0 +1,13 @@ +# [gomobile](https://pkg.go.dev/golang.org/x/mobile/cmd/gomobile) + [Swift Package Manager](https://swift.org/package-manager/) + +Example [Go](https://golang.org/) package built into an [XCFramework](https://developer.apple.com/documentation/swift_packages/distributing_binary_frameworks_as_swift_packages) for [Swift Package Manager](https://swift.org/package-manager/), targeting iOS, macOS, and macCatalyst targets. + +## Requirements + +Go 1.16, Swift 5.3, and Xcode 11 or later. + +## Usage + +To build the XCFramework and Swift package: `make build` + +To test: `make test` diff --git a/example/swift-package/Sources/GetGo/get.go b/example/swift-package/Sources/GetGo/get.go new file mode 100644 index 000000000..c4c8f42a3 --- /dev/null +++ b/example/swift-package/Sources/GetGo/get.go @@ -0,0 +1,22 @@ +package Go + +import ( + "io" + "net/http" +) + +// Get makes an HTTP(S) GET request to url, +// returning the resulting content or an error. +func Get(url string) ([]byte, error) { + res, err := http.Get(url) + if err != nil { + return nil, err + } + defer res.Body.Close() + return io.ReadAll(res.Body) +} + +// Version returns the version string for this package. +func Version() string { + return "0.0.1" +} diff --git a/example/swift-package/Sources/GetKit/GetKit.swift b/example/swift-package/Sources/GetKit/GetKit.swift new file mode 100644 index 000000000..d2dc7b25e --- /dev/null +++ b/example/swift-package/Sources/GetKit/GetKit.swift @@ -0,0 +1 @@ +// Stub file so Swift Package Manager doesn’t complain diff --git a/example/swift-package/Tests/GetKitTests/GetTest.swift b/example/swift-package/Tests/GetKitTests/GetTest.swift new file mode 100644 index 000000000..5332b37c2 --- /dev/null +++ b/example/swift-package/Tests/GetKitTests/GetTest.swift @@ -0,0 +1,27 @@ +import XCTest + +@testable import GetGo + +class GetTests: XCTestCase { + func testGet() { + var error: NSErrorPointer = nil + let response = GoGet("https://golang.org/", error) + XCTAssertNil(error) + guard let response = response else { + XCTFail("response == nil") + return + } + guard let str = String(data: response, encoding: .utf8) else { + XCTFail("str == nil") + return + } + XCTAssert(str.contains("Go")) + XCTAssert(str.contains("an open source programming language")) + XCTAssert(str.contains("https://play.golang.org")) + } + + func testVersion() { + let version = GoVersion() + XCTAssertEqual(version, "0.0.1") + } +} From fbf25be80d36f4a8e73721f47aae0bba3201fa46 Mon Sep 17 00:00:00 2001 From: Randy Reddig Date: Wed, 15 Sep 2021 22:09:59 -0700 Subject: [PATCH 2/2] .gitignore: ignore .build directories generated by Swift Package Manager --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index c7abc869b..16cc24a07 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ last-change *.iml .idea .gradle +.build # Android Studio build and IDE configuration files. example/bind/android/local.properties