Swift3.0-preview-1で追加されたswift packageを試してみた

Swift3.0-preview-1で追加されたswift packageを試してみた

f:id:moapp:20160606013623p:plain

github.com

3.0-preview-1-SNAPSHOT-2016-05-31-aのSwiftがリリースされ、このバージョンからswift packageコマンドが使えるようになりました。

これはSwift Package Managerを使用する際に利用するコマンドになります。この記事では環境構築、使い方を説明していきます。

Swift Package Managerの環境を構築する

SwiftのバージョンをSwift3.0-preview-1版に変更する

swift packageコマンドが使えるようになった3.0-preview-1-SNAPSHOT-2016-05-31-aのSwiftを使用します。

swift.orgからSwift3.0-preview-1版のsnapshotをダウンロードしてくる

swift.org

上記からSwift3.0-preview-1版Swiftのsnapshotをダウンロードし、インストールしておきます。

swiftenvでSwiftのバージョンをSwift3.0-preview-1版に切り替える

moapp.hateblo.jp

今回はswiftenvを利用してSwiftのバージョンを変更します。

swiftenvは上記記事にてセットアップについて説明してますので参考にしてください。

swiftenv global 3.0-preview-1-SNAPSHOT-2016-05-31-a

これで設定してるSwiftが3.0-preview-1-SNAPSHOT-2016-05-31-aのバージョンに変更されました。

念のためにバージョンが変更されたか確認しておきましょう。

$ swift --version
Apple Swift version 3.0-dev (LLVM 3863c393d9, Clang d03752fe45, Swift e996f0c248)
Target: x86_64-apple-macosx10.9
$ swiftenv version
3.0-preview-1-SNAPSHOT-2016-05-31-a (set by /Users/__moai/.swiftenv/version)

ここでバージョンが切り替わっていれば成功です。

TOOLCHAINSにパスを通す

swift packageコマンドを利用するためにパスを通します。

OS、環境によって違うので、それに合わせて変更しましょう。

Xcode 7.2の場合

export PATH=/Library/Toolchains/swift-latest.xctoolchain/usr/bin:$PATH

Xcode 7.3の場合

export TOOLCHAINS=swift

Linuxの場合

export PATH=path/to/toolchain/usr/bin:$PATH

swift packageがの環境が構築できたか確認する

swift packageのコマンドが利用できるようになったかを確認します。

バージョンが表示されるかどうか以下のコマンドを叩いて確認しましょう。

$ swift package --version
Swift Package Manager – Swift 3.0

エラーが出る場合はSwiftのバージョン、pathの設定がおかしい可能性があるのでその辺りを調べてみると良いかもしれません。

Swift Package Managerを試してみる

それではswift packageコマンドを試していきましょう。

swift packageコマンドを叩いてみます。

$ swift package
OVERVIEW: Perform operations on Swift packages

USAGE: swift package [command] [options]

COMMANDS:
  init [--type <type>]                   Initialize package (library|executable)
  fetch                                  Fetch package dependencies
  update                                 Update package dependencies
  generate-xcodeproj [--output <path>]   Generates an Xcode project
  show-dependencies [--format <format>]  Print dependency graph (text|dot|json)
  dump-package [--output <path>]         Print Package.swift as JSON

OPTIONS:
  -C, --chdir <path>        Change working directory before any other operation
  --color <mode>            Specify color mode (auto|always|never)
  -v, --verbose             Increase verbosity of informational output
  --version                 Print the Swift Package Manager version
  -Xcc <flag>               Pass flag through to all C compiler invocations
  -Xlinker <flag>           Pass flag through to all linker invocations
  -Xswiftc <flag>           Pass flag through to all Swift compiler invocations

NOTE: Use `swift build` to build packages, and `swift test` to test packages

上記のように使い方が出力されてますね。

swift packageから雛形を作る

Hogeディレクトリを作成して0の状態からPckageの雛形を作成します。

雛形を作成するときにはswift package initコマンドを叩きます。

mkdir Hoge
cd Hoge
swift package init

すると、下記のログが出力され雛形が生成されます。

Creating library package: Hoge
Creating Package.swift
Creating .gitignore
Creating Sources/
Creating Sources/Hoge.swift
Creating Tests/
Creating Tests/LinuxMain.swift
Creating Tests/Hoge/
Creating Tests/Hoge/HogeTests.swift

それでは自動生成されたファイルの中身を見ていきましょう。

Package.swift

ディレクトリ名をそのままPackage名として定義しています。

import PackageDescription

let package = Package(
    name: "Hoge"
)

.gitignore

ビルドによる成果物、依存してるPackage群、Xcodeプロジェクトファイルなどがignoreとしたいファイルのようです。

.DS_Store
/.build
/Packages
/*.xcodeproj

Sources/Hoge.swift

ディレクトリ名の構造体が定義されており、textのプロパティにはHello, World!が値として入っています。

雛形的にrootの構造体としてここからライブラリにアクセスさせたい意図があるようにも思えます。

struct Hoge {

    var text = "Hello, World!"
}

Tests/LinuxMain.swift

Tests/LinuxMain.swiftがテストの際に最初に呼ばれるファイルになります。

ここではターゲットとなるTestの全クラスをXCTMainに渡して教えてあげています。

import XCTest
@testable import HogeTestSuite

XCTMain([
     testCase(HogeTests.allTests),
])

Tests/Hoge/HogeTests.swift

自動生成するHoge構造体が保持してるtextの中身をテストしています。

先ほどのTests/LinuxMain.swiftで見たようにallTestsとしてTestする内容の一覧を返すようにしています。

import XCTest
@testable import Hoge

class HogeTests: XCTestCase {
    func testExample() {
        // This is an example of a functional test case.
        // Use XCTAssert and related functions to verify your tests produce the correct results.
        XCTAssertEqual(Hoge().text, "Hello, World!")
    }


    static var allTests : [(String, (HogeTests) -> () throws -> Void)] {
        return [
            ("testExample", testExample),
        ]
    }
}

swift packageからXcodeのプロジェクトファイルを生成する

Hogeディレクトリで自動生成したファイルを元にXcodeのプロジェクトファイルを生成します。

下記コマンドを先ほどのHogeディレクトリ上で叩きます。

swift package generate-xcodeproj

すると下記ログが出力されプロジェクトファイルが生成されます。

generated: ./Hoge.xcodeproj

早速Xcodeで開いてみましょう。

f:id:moapp:20160606012850p:plain

自動でコードがプロジェクトファイルに紐付けされた状態になっていますね。

このようにswift packageコマンドを使えばSwiftのコーディングに集中することができます。

どんどんSwiftで良いコードを書いていきましょう。