Swiftバックエンド開発
7300 ワード
原文は静雅斎から、転載は出典を明記してください.
新しい近代的な言語として、Swiftはアップルが言語を開発する上での集大成と言える.多くの言語の長所を吸収している.また、アップルはSwiftがサービス開発に役立つことを期待している.さらに魅力的なのは、コンパイル言語としてC++の一般的な性能を持ち、Golang、Javaに比べてARC管理メモリを使用することでGCによるプロセス停止を回避することです.Swiftはプログラマーが夢見ていた言葉と言える.
Swiftが現在バックエンドで開発している欠点
Swift自体には多くの利点がありますが、バックエンドの開発には依然として責任があります.例えば、次のような問題があります.現在Ubuntu下のバイナリパケットのみが適合する、RHEL等他のLinux下のバイナリパケット はない.非MacシステムのIDE開発が不足しており、これはJetbrainsが を期待するしかないように見えます.他の言語ほど完備していない生態系 では、パッケージ管理システムの構文ドキュメントなど、不足しているドキュメントは、ソースコード を自分で表示する必要があります.クロスコンパイルチェーンがないため、Mac上でLinuxで利用可能なバイナリファイル をコンパイルすることはできません.使いやすいユニットテストが欠けている しかし、これらの問題は現在克服する方法があります.例えば、DockerをSwiftプログラムを搭載する容器として使用し、Macを使用してSwiftプログラムを開発するのも大きな問題ではありません.多くのバックエンド開発はMacで開発されているからです.
Dockerの役割
筆者個人はDockerが解決した最大の問題は開発環境と生産環境の矛盾であり、開発者にとって、新しいものを追うことは永遠に必須の素質であり、テストとメンテナンスは環境変更による問題を望んでいないと考えている.例えば、オンラインサーバがCentOSを走っているのに対し、SwiftはUbuntu上で実行しなければならないが、Dockerの出現はこの問題を解決することができる.筆者はDockerで実行するのに最も適しているのはWebのようなサービスであり,NginxやデータベースなどはDockerに置くのに適していないと考えている.状態があるため,Dockerのような急速な消滅と迅速な作成のモードもデータベースのようなデータに厳しい要求を持つ応用には適していない.もちろん、Kubernetesが現在発売しているpetsetは、データベースのようなステータスのあるアプリケーションに適しています.
Perfectフレームワーク
PerfectフレームワークはSwiftが開発したWebアプリケーションサーバであり、Redis、SQLite、PostgreSQL、MySQL、MongoDB、FileMakerのようなデータベースをサポートし、fastcgiまたはWebサーバとしてサービスを提供することができる.さらに素晴らしいのは、高品質の中国語ドキュメントです.
HelloWorld
Perfectは、次のコマンドを使用してダウンロードできる基礎テンプレートエンジニアリングを提供しています.
インストール依存
コンパイルして実行できます
分析ハローワールド
HelloWorldエンジニアリングは
Nodeのexpressフレームワークを使ったことのある友人はよく知っているのではないでしょうか.イベントループを使ってHTTPリクエストを処理していますが、実際には初期のPerfectフレームワークはlibevフレームワークでイベントループのHTTPリクエストを処理しています.arguments.swift
ここで簡単なのは、HTTPサーバの作成にパラメータを提供することですが、この利点は、パラメータによってより多くの機能を得ることができることです.
独自のプロジェクトを作成
まず、
その後、Package.swiftで依存性が増加したが、Swiftは現在、すべてのIDEが
その後main.swiftファイルを作成し、HTTPServerリスニングポートを作成すると、独自のプロジェクトを作成できます.
Docker
一般的に、Dockerは現在、Swiftを実行するにはUbuntuのミラーを使用する必要があります.SwiftのプリコンパイルパッケージはUbuntuの圧縮パッケージのみを提供しているため、サポートライブラリが不足しているなど、多くのDockerミラーには多くの問題があります.以下の変更が必要です.次に、サンプルを提供します.
Perfectがlibcurlを必要とするのは、
新しい近代的な言語として、Swiftはアップルが言語を開発する上での集大成と言える.多くの言語の長所を吸収している.また、アップルはSwiftがサービス開発に役立つことを期待している.さらに魅力的なのは、コンパイル言語としてC++の一般的な性能を持ち、Golang、Javaに比べてARC管理メモリを使用することでGCによるプロセス停止を回避することです.Swiftはプログラマーが夢見ていた言葉と言える.
Swiftが現在バックエンドで開発している欠点
Swift自体には多くの利点がありますが、バックエンドの開発には依然として責任があります.例えば、次のような問題があります.
Dockerの役割
筆者個人はDockerが解決した最大の問題は開発環境と生産環境の矛盾であり、開発者にとって、新しいものを追うことは永遠に必須の素質であり、テストとメンテナンスは環境変更による問題を望んでいないと考えている.例えば、オンラインサーバがCentOSを走っているのに対し、SwiftはUbuntu上で実行しなければならないが、Dockerの出現はこの問題を解決することができる.筆者はDockerで実行するのに最も適しているのはWebのようなサービスであり,NginxやデータベースなどはDockerに置くのに適していないと考えている.状態があるため,Dockerのような急速な消滅と迅速な作成のモードもデータベースのようなデータに厳しい要求を持つ応用には適していない.もちろん、Kubernetesが現在発売しているpetsetは、データベースのようなステータスのあるアプリケーションに適しています.
Perfectフレームワーク
PerfectフレームワークはSwiftが開発したWebアプリケーションサーバであり、Redis、SQLite、PostgreSQL、MySQL、MongoDB、FileMakerのようなデータベースをサポートし、fastcgiまたはWebサーバとしてサービスを提供することができる.さらに素晴らしいのは、高品質の中国語ドキュメントです.
HelloWorld
Perfectは、次のコマンドを使用してダウンロードできる基礎テンプレートエンジニアリングを提供しています.
> git clone [email protected]:PerfectlySoft/PerfectTemplate.git
インストール依存
> swift package fetch
コンパイルして実行できます
# Debug
> swift build
# Release
> swift build -c release
分析ハローワールド
HelloWorldエンジニアリングは
Perfect-HTTPServer
モジュールに依存し、そのうち2つのソースファイル、arguments.swift
とmain.swift
main.swiftがあります.import PerfectLib
import PerfectHTTP
import PerfectHTTPServer
// Create HTTP server.
let server = HTTPServer()
// Register your own routes and handlers
var routes = Routes()
routes.add(method: .get, uri: "/", handler: {
request, response in
response.setHeader(.contentType, value: "text/html")
response.appendBody(string: "Hello, world! Hello, world!")
response.completed()
}
)
// Add the routes to the server.
server.addRoutes(routes)
// Set a listen port of 8181
server.serverPort = 8181
// Set a document root.
// This is optional. If you do not want to serve static content then do not set this.
// Setting the document root will automatically add a static file handler for the route /**
server.documentRoot = "./webroot"
// Gather command line options and further configure the server.
// Run the server with --help to see the list of supported arguments.
// Command line arguments will supplant any of the values set above.
configureServer(server)
do {
// Launch the HTTP server.
try server.start()
} catch PerfectError.networkError(let err, let msg) {
print("Network error thrown: \(err) \(msg)")
}
Nodeのexpressフレームワークを使ったことのある友人はよく知っているのではないでしょうか.イベントループを使ってHTTPリクエストを処理していますが、実際には初期のPerfectフレームワークはlibevフレームワークでイベントループのHTTPリクエストを処理しています.arguments.swift
import PerfectHTTPServer
import PerfectLib
#if os(Linux)
import SwiftGlibc
#else
import Darwin
#endif
// Check all command line arguments used to configure the server.
// These are all optional and you can remove or add arguments as required.
func configureServer(_ server: HTTPServer) {
var sslCert: String?
var sslKey: String?
var args = CommandLine.arguments
func argFirst() -> String {
guard let frst = args.first else {
print("Argument requires value.")
exit(-1)
}
return frst
}
let validArgs = [
"--sslcert": {
args.removeFirst()
sslCert = argFirst()
},
"--sslkey": {
args.removeFirst()
sslKey = argFirst()
},
"--port": {
args.removeFirst()
server.serverPort = UInt16(argFirst()) ?? 8181
},
"--address": {
args.removeFirst()
server.serverAddress = argFirst()
},
"--root": {
args.removeFirst()
server.documentRoot = argFirst()
},
"--name": {
args.removeFirst()
server.serverName = argFirst()
},
"--runas": {
args.removeFirst()
server.runAsUser = argFirst()
},
"--help": {
print("Usage: \(CommandLine.arguments.first!) [--port listen_port] [--address listen_address] [--name server_name] [--root root_path] [--sslcert cert_path --sslkey key_path] [--runas user_name]")
exit(0)
}]
while args.count > 0 {
if let closure = validArgs[args.first!.lowercased()] {
closure()
}
args.removeFirst()
}
if sslCert != nil || sslKey != nil {
if sslCert == nil || sslKey == nil {
print("Error: if either --sslcert or --sslkey is provided then both --sslcert and --sslkey must be provided.")
exit(-1)
}
if !File(sslCert!).exists || !File(sslKey!).exists {
print("Error: --sslcert or --sslkey file did not exist.")
exit(-1)
}
server.ssl = (sslCert: sslCert!, sslKey: sslKey!)
}
}
ここで簡単なのは、HTTPサーバの作成にパラメータを提供することですが、この利点は、パラメータによってより多くの機能を得ることができることです.
独自のプロジェクトを作成
まず、
swift package init
コマンドを使用してプロジェクトを作成します.一般的には、次のようになります.> swift package init --type executable
その後、Package.swiftで依存性が増加したが、Swiftは現在、すべてのIDEが
PackageDescription
モジュールに対するコードプロンプトを提供していない.これはSwift内蔵モジュールであるためと推定される.具体的な内容は、Swiftソースコードで見つけることができます.一般的には以下のような内容を追加すればimport PackageDescription
let package = Package(
name: "XXXX",
dependencies: [
.Package(url: "https://github.com/PerfectlySoft/Perfect-HTTPServer.git", majorVersion: 2, minor: 0)
]
)
その後main.swiftファイルを作成し、HTTPServerリスニングポートを作成すると、独自のプロジェクトを作成できます.
Docker
一般的に、Dockerは現在、Swiftを実行するにはUbuntuのミラーを使用する必要があります.SwiftのプリコンパイルパッケージはUbuntuの圧縮パッケージのみを提供しているため、サポートライブラリが不足しているなど、多くのDockerミラーには多くの問題があります.以下の変更が必要です.次に、サンプルを提供します.
FROM swiftdocker/swift:3.0.1
MAINTAINER ChasonTang
RUN apt-get update \
&& apt-get install -y uuid-dev libcurl4-openssl-dev libssl-dev \
&& git clone https://github.com/PerfectlySoft/PerfectTemplate /usr/src/PerfectTemplate \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
WORKDIR /usr/src/PerfectTemplate
RUN swift build -c release
CMD .build/release/PerfectTemplate --port 80
Perfectがlibcurlを必要とするのは、
swift build
が依存を取得する際にcurlを使用してコードを取得するためであり、uuidはPerfectフレームワークに関数ライブラリを内蔵するために必要であり、opensslはPerfect依存のライブラリに必要である.ここではgit clone方式でエンジニアリングコードを取得しますが、COPY命令で現在のディレクトリの下のファイルをコピーすることもできます.