如何在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开发人员而言,游乐场非常适合,因为他们可以从内部评估用户的行为。 当然,这是“用手触摸文档”的好地方。

祝好运!