don't stop believing

SPM에서 framework와 실행부분 코드 분리하기 본문

Swift/Basic

SPM에서 framework와 실행부분 코드 분리하기

Tongchun 2017. 9. 15. 13:40

Swift로 command line tool을 만들거나 서버 프로그래밍을 할때 코드를 분리하고 싶을때가 있다.

실행 부분과 로직 부분으로 구분하는 예제를 한번 만들어 봅시다.


먼저 적당한 곳에 프로젝트 폴더를 만듭니다. 저는 nGle002라고 만들었습니다.

$ mkdir nGle002
$ cd nGle002

SMP로 프로젝트를 만들어 봅시다.

$ swift package init --type executable

package init을 하면 몇개의 파일과 폴더가 생성된다.

Package.swift: package 및 dependencies 정의(지정)

Source 폴더:  프로그래밍 소스가 위채해야 할 폴더이며 main.swift 파일이 존잼함. main.swift 파일은 프로그램의 인입점(entry point)가 됨.

Test 폴더: 테스트 코드를 둠.

.gitignore: SPM의 .build폴더와 Xcode 프로젝트 파일 등을 관리함.


소스 구분은 Source 폴더 안에서 구분하게 됩니다. Source 폴더로 가서 구분하려는 코드르 폴더를 만듭니다.

CommandLineTool 이라는 실행 부분과 CommandLineToolCore라는 로직 부분으로 구분하고 싶습니다.

CommandLineTool은 실행 부분이므로 main.swift 파일이 위채해야 합니다.

$ cd Source
$ mkdir CommandLineTool
$ mkdir CommandLineToolCore
$ mv main.swift CommandLineTool/

그리고 CommnadLineToolCore 폴더안에도 파일을 만들어 줍니다. 저는 CommandLineTool.swift파일을 만들었습니다.

$ cd CommandLineToolCore
$ touch CommandLineTool.swift

먼저 개발 편의를 위해 xcode 프로젝트를 생성해 줍니다. xcode 변환은 프로젝트 최산단 폴더(/)에서 해줘야 합니다.

xcode로 변환했다면 열어 봅니다.

$ cd ../..
$ swift package generate-xcodeproj
$ open nGle002.xcodeproj/

SPM에서 Source폴더 안의 폴더는 framework이 됩니다. 따라서 Package.swift파일에서 Target을 잡아줘야 합니다.

Package.swift에 아래와 같이 Target을 잡습니다.

import PackageDescription

let package = Package(
    name: "nGle002",
    targets: [
        Target(name: "CommandLineTool",
               dependencies: ["CommandLineToolCore"]),
        Target(name: "CommandLineToolCore")
    ]
)

그리고 CommandLineToolCore 폴더안의 CommandLineTool.swift파일을 열어 프로그램 로직에 대한 코드를 구분해서 작성해 줍니다.

import Foundation

public final class CommandLineTool {
    private let arguments: [String]

    public init (arguments: [String] = CommandLine.arguments) {
        self.arguments = arguments
    }

    public func run() throws {
        print("Hello, tongchun!")
    }
}

이번엔 main.swift파일에서 CommandLineToolCore를 import하고 CommandLineTool 클레스의 run() 함수를 호출해 봅시다.

import CommandLineToolCore

let tool = CommandLineTool()

do {
    try tool.run()
} catch {
    print("Woops! An error occurred: \(error)")
}

이제 터미널에서 빌드를 하고 실행시켜 봅시다.

$ swift build
$ .build/debug/CommandLineTool

실행 후 Hello, tongchun!이 출력되었다면 성공.


Package.swift에 다른 dependencies를 추가하고 싶다면 아래처럼 작성하면 된다.

import PackageDescription

let package = Package(
    name: "nGle002",
    targets: [
        Target(name: "CommandLineTool",
               dependencies: ["CommandLineToolCore"]),
        Target(name: "CommandLineToolCore")
    ],
    dependencies: [
        .Package(url: "https://github.com/Alamofire/Alamofire.git", majorVersion: 4, minor: 4),
        .Package(url: "https://github.com/SwiftyJSON/SwiftyJSON.git", majorVersion: 3, minor: 1),
        .Package(url: "https://github.com/johnsundell/files.git", majorVersion: 1)
    ]
)

제대로 추가 되었는지 빌드를 해봅니다.

$ swift package update
$ swift build
$ .build/debug/CommandLineTool

이것으로 SPM에서 framework 분리 끝

'Swift > Basic' 카테고리의 다른 글

탈출 클로저 @escaping  (0) 2018.01.31
defer (후처리)  (0) 2018.01.24
Swift Access Control  (0) 2018.01.19
[swift] command line tool - static/interactive  (0) 2017.08.17
[swift] command line tool 만들기 기본편  (0) 2017.08.16
Comments