LoginSignup
1
1

More than 5 years have passed since last update.

Vaporで新規ファイルを追加したら

Posted at

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のモジュールに属していて、新しく追加したAddFileAppに登録されており、異なったターゲットメンバーシップになっていたのにもかかわらずAClassクラスの公開設定がInternal(モジュール間のみ公開)になっていました。
そのため、main.swiftでは異なるモジュールのAClassクラスを見つけられずuse of unresolved identifierのエラーが発生していました。

これを解決するためにはAClassクラスをpublicにします。

public class AClass {
    public init(){}
}

ビルドしてみます。

$ vapor build

上手くいけばビルドが成功するはずです。

$ vapor build
Building Project [Done]

参考

swift build use of unresolved identifier

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1