使用Swift包管理器导入模块

时间:2017-11-13 15:37:31

标签: swift swift-package-manager

我正在尝试使用Swift的软件包管理器来导入项目中的外部模块。我的第一个模块来自Vapor project。我似乎无法让它工作。我从

开始
swift package init
swift package generate-xcodeproj

我的Package.swift看起来像这样:

import PackageDescription

let package = Package(
    name: "OpenTools",
    products: [
        .library(
            name: "OpenTools",
            targets: ["OpenTools"]),
    ],
    dependencies: [
        .package(url: "https://github.com/vapor/json.git", from: "2.0.0")
    ],
    targets: [
        .target(name: "OpenTools", dependencies: ["JSON"]),
    ]
)
然后我跑

swift package update
swift package generate-xcodeproj # to regenerate with dependencies

然后尝试在我的主文件中导入JSON包

import JSON

模块在那里如下所示,但导入返回时出现No such module 'JSON'错误。

enter image description here

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

如果我有足够的声誉,我会将此作为评论。 ;)
可能问题在于Xcode,因为它还不知道,JSON存在,因为它还没有构建。只需构建项目(使用cmd-B)即可轻松解决这个问题。使用生成的xcodeproj,Xcode应该知道它首先需要构建JSON然后构建其余部分,因为JSON被标记为目标的依赖项。
您可以通过在Xcode中导航到目标(当您单击项目描述文件时)以及之后的“构建阶段”来检查这一点。在Tar​​get Dependencies下,您应找到JSON模块。

此外,您应该在目标下找到一个JSON模块,它会编译您从github收集的来源。

您的项目也应该在项目根目录中执行swift build时构建。

答案 1 :(得分:1)

使用Xcode 11,您应该可以直接打开#include "pch.h" #include <iostream> using namespace std; template <typename Object> class Collection { public: int ndx = 0; Object *data[10] = { nullptr }; void insert(Object obj) { if (ndx == 10) { cout << "Container is full!!" << endl; } else { data[ndx] = &obj; //cout << data[ndx]->area() << endl; ++ndx; cout << "Inserted in Location: " << ndx - 1 << endl; } } void isEmpty() { if (ndx > 0) { cout << "Not empty " << ndx << " items!" << endl; } else { cout << "Is empty, " << ndx << " items!" << endl; } } void makeEmpty() { for (int i = 0; i < ndx; i++) data[i] = nullptr; ndx = 0; cout << "It is Empty!" << endl; } void remove(Object obj) { cout << obj.area() << "here" << endl; int index = -1; for (int i = 0; i < ndx; i++) { if (data[i] == obj) { index = i; } } if (index != -1) { if (index == ndx - 1) --ndx; else { for (int i = index; i < ndx; i++) { data[i] = data[i + 1]; } --ndx; data[ndx] = nullptr; } cout << "Object Removed Location: " << index << endl; } else { cout << "Object not found!" << endl; } } bool contains(Object obj) { for (int i = 0; i < ndx; i++) { if (data[i] == obj) { return true; } } return false; } }; class Rec { public: int width; int hieght; void setValues(int &w, int &h) { width = w; hieght = h; } void setWidth(int &w) { width = w; } void setHieght(int &h) { hieght = h; } int area() { return width * hieght; }; bool operator==(const Rec& rhs)const { cout << "used Normal" << endl; return (width == rhs.width) && (hieght == rhs.hieght); } }; bool operator==(Rec * lhs, Rec rhs) { cout << "used *" << endl; return (lhs->width == rhs.width) && (lhs->hieght == rhs.hieght); } int main() { Collection<Rec> test; for (int i = 0; i < 11; i++) { Rec r; r.setValues(i, i); test.insert(r); } Rec r; int i = 22; r.setValues(i, i); bool t = test.contains(r); cout << "Here?: " << t << endl; r.setValues(i, i); test.remove(r); test.makeEmpty(); //cout << test.data[6]->area() << endl; return 0; } ,这将为您验证软件包清单(aka:Package.swift文件)和编译目标提供一个试验场。这应该有助于了解导致错误的实际原因,该错误阻止了模块的编译。