Server Side SwiftのフレームワークVaporで開発していました。
新しいファイルを追加したらビルドができなくなっていた。
その対処法を記します。
#実行環境
- Xcode9.0
- Vapor Toolbox: 2.0.4
- Vapor Framework: 2.2.2
- Apple Swift version 4.0 (swiftlang-900.0.65 clang-900.0.37)
問題点
Vaporのプロジェクトに新しいファイルを追加しそこにクラスを作って、ビルドしようとすると作ったクラスが見つからずビルドが失敗しました。
Xcodeプロジェクトを生成し、Xcodeからファイルを追加しています。
下記はAddFile.swift
を作成し、AClass
クラスを定義した例です。
//
// AddFile.swift
// SampleRoutingPackageDescription
//
// Created by satoutakeshi on 2017/10/21.
//
import Foundation
class AClass {
init(){}
}
これをmain.swift
から呼んでみます。
//Sources/Run/main.swift
let _ = AClass()
コマンドラインからビルドしてみます。
$ vapor build
下記のようなエラーがでてビルドが失敗します。
$ vapor build
Building Project [Failed]
Command:
build --enable-prefetching
Error (1):
error: terminated(1): /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift-build-tool -f '/path/to/.build/debug.yaml' main
Output:
Compile Swift Module 'App' (7 sources)
Compile Swift Module 'Run' (1 sources)
/path/to/Sources/Run/main.swift:131:9: error: use of unresolved identifier 'AClass'
let _ = AClass()
^~~~~~
use of unresolved identifier
ということでmain.swift
上でAClass
を認識していないことがわかります。
解決方法
原因は各ファイルのプロジェクトのターゲットメンバーシップが異なることが原因でした。
main.swift
はデフォルトではRun
のモジュールに属していて、新しく追加したAddFile
がApp
に登録されており、異なったターゲットメンバーシップになっていたのにもかかわらずAClass
クラスの公開設定がInternal
(モジュール間のみ公開)になっていました。
そのため、main.swift
では異なるモジュールのAClass
クラスを見つけられずuse of unresolved identifier
のエラーが発生していました。
これを解決するためにはAClass
クラスをpublic
にします。
public class AClass {
public init(){}
}
ビルドしてみます。
$ vapor build
上手くいけばビルドが成功するはずです。
$ vapor build
Building Project [Done]