如何在Xcode 10中制作Vapor 3 Swift Playground
当您想学习新东西时,更好的学习机会就是尝试它。 这来自我们的童年。
Vapor是Swift编程语言的框架,旨在简化服务器应用程序。 该框架使用现代的编程模式,并利用了Apple的低级非阻塞和事件驱动IO库,称为SwiftNIO。
SwiftNIO&Vapor使用并发编程技术以及诸如Future和Promise之类的抽象。 为了深入理解,我需要触摸它。 因为如此简单,我决定制作Swift游乐场!
让我们先安装Vapor。 您可以使用自己的文档进行此操作:
macOS –蒸气安装
docs.vapor.codes
SwiftNIO被安装为依赖项。 让我们创建沙盒项目:
$ vapor new Sandbox
$ cd Sandbox && vapor xcode
vapor将创建初始项目结构,并将生成.xcodeproj文件。 最后,它将询问您是否打开Xcode。 点击“ y”
您必须看到类似以下内容:
看起来不太友善,是吗? 让我们打开Project Navigator:
现在,更清楚了什么是内幕。 让我们去游乐场玩吧。 首先从项目中创建Xcode工作区:
称之为沙箱。 现在,在Workspace内部但在Sandbox项目外部创建Playground。 最小化Sandbox项目文件夹,然后右键单击Project导航器中的任何空白点:
选择“新建文件”,然后在弹出的窗口中选择“空白操场”。 留下MyPlayground作为名称或选择自己的名称:
瞧!
现在我们必须导入我们的模块:Vapor和ORM,它们在此模板项目FluentSQLite中被调用。 在将模块导入操场之前,我们必须先构建它们。 我们开始做吧:
Xcode将构建运行方案,该方案还将构建所有基础依赖项。 现在我们可以将所需的模块导入到我们的游乐场。 这样做并按Run(运行)—代码左侧的“播放箭头”:
底部有错误。 该怎么办?
导致此错误的原因是,依赖项中存在的C框架(例如CNIOAtomics)不在Xcode的Framework系统文件夹中。 Xcode保留有关头文件的信息,并根据此信息使其成为内部符号查找表。
该文件夹的位置是$(PLATFORM_DIR)/Developer/Library/Frameworks,
在我的系统(Mojave 10.14.1)中,该文件夹代表/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Frameworks
我们必须为所有C模块依赖项创建伪造的框架文件夹。 让我们从CNIOAtomics开始:
$ cd /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Frameworks
$ sudo mkdir CNIOAtomics.framework
(MacOSX可能会在此处询问管理员密码)
$ cd CNIOAtomics.framework && sudo mkdir头文件&& sudo mkdir模块
现在,我们必须从CNIO Atomics依赖项中复制module.modulemap
文件。 为了了解它在Xcode项目中的位置,我将给您截图:
我们必须将module.modulemap
文件复制到我们的Framework Modules文件夹,并将所有*.h
文件复制到Headers文件夹。 Modulemap文件使用umbrella
声明在指定目录中查找.h
文件。 让我们继续:
$ sudo cp $(YOUR_SANDBOX_PROJECT_FOLDER)/.build/checkouts/swift-nio.git-2742909467676529921/Sources/CNIOAtomics/include/*.h Headers/
请注意, swift-nio.git-
之后swift-nio.git-
可能会因系统而swift-nio.git-
。
现在我们需要创建module.modulemap文件,类似于上一个屏幕截图中看到的文件。 不幸的是,Xcode会动态创建此文件,因此我们不能简单地复制和编辑。 我们将手动创建它:
echo“ cat < Modules / module.modulemap
CNIOAtomics模块{
雨伞 \”。\”
出口 *
}
EOF” | sudo -s
尝试运行游乐场:
您可以看到错误现在指向其他C模块,并且CNIOAtomics已被成功吞噬!
为了加快其他模块的移植速度,我创建了一个简单的bash脚本,该脚本将模块名称作为第一个参数,并将结帐目录的路径作为*.h
文件的第二个:
#!/ bin / bash
sudo mkdir $ 1。框架
cd $ 1。框架
sudo mkdir标头
sudo mkdir模块
sudo cp $ 2 / *。h标头/
echo“ cat < Modules / module.modulemap
模块$ 1 {
雨伞 \”。\”
出口 *
}
EOF” | sudo -s
让我们将其称为createFramework.sh并保存在我们的$(PLATFORM_DIR)/Developer/Library/Frameworks
文件夹中:
不要忘记赋予它可执行权限:
$ ls -al
共8个
drwxr-xr-x 5根轮160 Oct 11 13:38。
drwxr-xr-x 9根轮288 Oct 1 18:41 ..
drwxr-xr-x 4根轮128 Oct 11 13:15 CNIOAtomics.framework
drwxr-xr-x 8根轮256 Oct 1 18:41 XCTest.framework
-rwxr-xr-x 1根轮222 Oct 11 13:38 createFramework.sh
现在让我们创建所需的框架:
$ ./createFramework.sh CNIODarwin $(YOUR_SANDBOX_PROJECT_FOLDER)/.build/checkouts/swift-nio.git-2742909467676529921/Sources/CNIODarwin/include
$ ./createFramework.sh CNIOLinux $(YOUR_SANDBOX_PROJECT_FOLDER)/.build/checkouts/swift-nio.git-2742909467676529921/Sources/CNIOLinux/include
下一个软件包CNIOOpenSSL位于swift-nio-ssl.git依赖项中:
$./createFramework.sh CNIOOpenSSL $(YOUR_SANDBOX_PROJECT_FOLDER)/.build/checkouts/swift-nio-ssl.git-
879315339788638733/Sources/CNIOOpenSSL/include
CCryptoOpenSSL在crypto.git依赖项中:
$ ./createFramework.sh CCryptoOpenSSL $(YOUR_SANDBOX_PROJECT_FOLDER)/.build/checkouts/
crypto.git--6149069719189238419 / Sources / CCryptoOpenSSL / include
libbase32和libbcrypt框架的情况略有不同。 他们的*.h
文件位于Sources中,而不位于Sources / include中
$ ./createFramework.sh libbase32$(YOUR_SANDBOX_PROJECT_FOLDER)
build/checkouts/crypto.git--6149069719189238419$(YOUR_SANDBOX_PROJECT_FOLDER)
CBase32
$ ./createFramework.sh libbcrypt$(YOUR_SANDBOX_PROJECT_FOLDER)
build/checkouts/crypto.git--6149069719189238419$(YOUR_SANDBOX_PROJECT_FOLDER)
CBcrypt
CNIOHTTPParser,CNIOZlib和CNIOSHA1再次在include中包含*.h
文件
$ ./createFramework.sh CNIOHTTPParser$(YOUR_SANDBOX_PROJECT_FOLDER)/
/ checkouts / swift-nio.git-2742909467676529921921 / Sources / CNIOHTTPParser / include
$ ./createFramework.sh CNIOZlib$(YOUR_SANDBOX_PROJECT_FOLDER)/
/ checkouts / swift-nio.git-2742909467676529921921 / Sources / CNIOZlib / include
$ ./createFramework.sh CNIOSHA1$(YOUR_SANDBOX_PROJECT_FOLDER)/
/ checkouts / swift-nio.git-2742909467676529921 / Sources / CNIOSHA1 / include
就是这样! 至少对于选定的导入模块…
现在我们可以开始使用Vapor和基础框架了。 我们可以创建所有需要的模型,应用程序配置和处理程序,并导入应用程序库。
不要忘记公开属性和方法,以便在操场上使用它们。 不要忘记在App子文件夹中进行更改后构建所有内容。
对于Frameworks开发人员而言,游乐场非常适合,因为他们可以从内部评估用户的行为。 当然,这是“用手触摸文档”的好地方。
祝好运!