Swift &引用;“快速测试”;以“失败”;可执行文件;但不是",;图书馆;?

Swift &引用;“快速测试”;以“失败”;可执行文件;但不是",;图书馆;?,swift,xctest,swift-package-manager,Swift,Xctest,Swift Package Manager,我正在Mac上用Swift开发一些服务器端代码,但最终要在Linux上部署。我已经使用Swift软件包管理器创建了我的项目结构。我已经为类创建了几个XCTestCase单元测试。然而,我注意到,如果我将目标产品设置为.executable,当我运行swift test时,我得到的输出类似于: 编译Swift模块“MyProjUtilTests”(3个源代码)链接 ./.build/x86_64-apple-macosx10.10/debug/MyProjUtilPackageTests.xtes

我正在Mac上用Swift开发一些服务器端代码,但最终要在Linux上部署。我已经使用Swift软件包管理器创建了我的项目结构。我已经为类创建了几个XCTestCase单元测试。然而,我注意到,如果我将目标产品设置为
.executable
,当我运行
swift test
时,我得到的输出类似于:

编译Swift模块“MyProjUtilTests”(3个源代码)链接 ./.build/x86_64-apple-macosx10.10/debug/MyProjUtilPackageTests.xtest/Contents/MacOS/MyProjUtilPackageTests 架构x86_64的未定义符号:
“\uuuu T012MyProjUtil16PropertyListUtilCMa”,引用自: __T017MYPROJUTILITESS20PropertyListList16TestReadFromFileyyyf在PropertyListListTest.swift.o“\uuu T012MyProjUtil3FooCMa”中引用 发件人: __T017MYPROJUTILITEST03FOOC07TESTRUND0YYFSSYKXKFU_uu_u_u_u_ufootests.swift.o“uuu T012MyProjUtilAAVABycfC”,参考自: __T017MYPROJUTILTESTSAAC11 MyProjUtilTests.swift.o ld:未找到架构的符号 x86_64:0:错误:link命令失败,退出代码为1(使用 -v查看调用)错误:已终止(1):/Applications/Xcode.app/Contents/Developer/Toolchains/xcodefault.xctoolchain/usr/bin/swift-build-tool -f/Volumes/Untitled/SwiftDev/MyProj/MyProjUtil/.build/debug.yaml测试


但是,如果我将目标产品更改为
.library
,并运行
swift test
,它将执行我的测试并在没有错误的情况下退出。这是Swift软件包管理器中的错误吗?为了在我的可执行产品中包含单元测试,我是否需要做其他事情?或者这是预期的行为?谁能解释一下我在这里看到了什么以及为什么?谢谢

是的,这是预期的行为

您可以在
软件包中设置三个目标。swift
。“MyAppLibTests”、“MyAppLib”和“MyAppExec”

“MyAppLibTests”依赖于“MyAppLib”。“MyAppExec”也依赖于“MyAppLib”。“MyAppLib”取决于您可能具有的任何外部依赖性

您的目录结构可能如下所示:

+-- Package.swift
|
+-- Sources/
| |
| +-- MyAppLib/
| |     ...files...
| |
| +-- MyAppLibExec/
|   |
|   +-- main.swift
|
+-- Tests/
  |
  +-- MyAppLibTests/
    |
    +-- MyTestCase.swift
然后在
main.swift
中导入MyAppLib;导入基础,然后可能解析命令行参数和环境变量。将选项传递到库的主入口点。类似于
MyAppMain().run(选项:parsedValue,选项2:parsedValue 2)

好处:要获取命令行参数,它们位于字符串数组中:
commandline.arguments
。要获取环境变量,它们位于字符串到字符串的字典中:
ProcessInfo.ProcessInfo.Environment[“SOME_ENV_VAR”]