Build Status - Master macOS Linux

Swift-cfenv

Swift-cfenv 包提供了结构体和方法来解析 Cloud Foundry 提供的配置变量,例如端口号、IP 地址和应用程序的 URL。 它还提供了在本地运行应用程序时的默认值。

该库根据是否设置了 VCAP_APPLICATION 配置变量来确定您是否在“本地”或云端(即作为 Cloud Foundry 应用程序)运行应用程序。 如果未设置,则假定您在“本地”模式而不是“云模式”下运行。

对于此 Swift 包的实现,我们借鉴了为 Node.js 应用程序开发的类似模块 node-cfenv

Swift 版本

最新版本的 Swift-cfenv 适用于 Swift 4.0 或更高版本。 您可以通过以下链接下载此版本的 Swift 二进制文件。

配置

最新版本的 Swift-cfenv 依赖于 Configuration 包来从多个源加载和合并配置数据,例如环境变量或 JSON 文件。 在以前版本的 Swift-cfenv 中,该库负责直接访问环境变量。 未来,新版本的 Swift-cfenv 将继续依赖于加载到 ConfigurationManager 实例中的配置数据。 有关 Configuration 包的更多详细信息,请参见其 README 文件。

用法

要在您的 Swift 应用程序中利用 Swift-cfenv 包,您应该在您的 Package.swift 文件中为其指定依赖项。

 import PackageDescription

 let package = Package(
     name: "MyAwesomeSwiftProject",

     ...

    dependencies: [
        .package(url: "https://github.com/Kitura/Swift-cfenv.git", .upToNextMajor(from: "5.0.0")),
        
        ...
    ]

    ...

相应地更新您的应用程序的 Package.swift 文件后,您可以在您的代码中导入 CloudFoundryEnvConfiguration 模块。

import Configuration
import CloudFoundryEnv

...

let configFileURL: URL = ...

...

let configManager = ConfigurationManager()
// To load configuration data from a file or environment variables:
//configManager.load(url: configFileURL)
//             .load(.environmentVariables)

// Use the given port and binding host values to create a socket for our server...
let ip: String = configManager.bind
let port: Int = configManager.port

...

// Once the server starts, print the url value
print("Server is starting on \(configManager.url).")

上面的代码片段通过 ConfigurationManager 对象获取绑定主机和端口值,您的 Swift 应用程序根据其需要(例如,JSON 文件、环境变量等)创建并填充该对象。 Swift-cfenv 查询 ConfigurationManager 实例以获取与 Cloud Foundry 相关的那些配置属性。 这些值然后用于绑定服务器。 此外,应用程序的 URL 值(也从配置属性中获取)可以用于日志记录目的,如上所示。

该库的主要目的是简化访问 Cloud Foundry 提供的配置值。

在 Cloud Foundry 中与本地运行您的应用程序

当您的应用程序在 Cloud Foundry 中作为环境变量运行时,将设置以下配置属性

在 Cloud Foundry 中运行时,Swift-cfenv 希望这些属性加载到您的应用程序实例化的 ConfigurationManager 实例中。

如果在查询 ConfigurationManager 时未找到 VCAP_APPLICATION,则假定您的应用程序正在本地运行。 对于这种情况,ConfigurationManager 实例返回的值仍然对于启动您的应用程序有用。 因此,此 Swift 包可以在 Cloud Foundry 中运行时使用,也可以在本地运行时使用。

API

ConfigurationManager

ConfigurationManagerConfiguration Swift 包提供的类。 Swift-cfenv 只是向该类添加了扩展点,这使您可以直接访问 Cloud Foundry 配置数据。 在您的 Swift 应用程序中,您可能首先从本地 JSON 文件加载配置数据(这使您可以在本地运行),然后再从环境变量加载配置数据。

如果您想创建一个 JSON 文件,您的应用程序可以利用它来进行本地开发,我们建议创建一个遵循以下格式的文件

ConfigurationManager 的扩展

ConfigurationManager 类的实例具有以下扩展属性

如果无法确定 port 属性的值,则为其分配默认端口 8080。 请注意,8080 是在 Diego 上运行的应用程序使用的默认端口值。

如果在本地运行,则用于 URL 的协议将为 http,否则将为 https。 您可以使用 options 参数上的 protocol 属性指定特定协议来覆盖此逻辑。

如果在云端(即在 Cloud Foundry 中)运行时无法确定实际的主机名,则 url 和 urls 值将以 localhost 作为其主机名值。

以下是 ConfigurationManager 对象的实例方法扩展

App

App 是一个结构体,其中包含以下 VCAP_APPLICATION 环境变量属性

App.Limits

App.Limits 结构体包含应用程序实例的内存、磁盘和文件数

Service

Service 是一个类,其中包含 Cloud Foundry service 的以下属性

在 IBM Cloud 上进行测试

要在 IBM Cloud 上测试此 Swift 库,您可以按照本节中描述的步骤进行操作,这些步骤使用 IBM Cloud 命令行

创建一个名为 cf-dummy-service 的虚拟服务

bx service user-provided-create cf-dummy-service -p "url, username, password, database"

IBM Cloud 命令行将会提示您输入以下信息(请输入一些合理的值)

url> http://swift-cfenv-service.test.com
username> username00
password> password00
database> CloudantDB

创建虚拟服务后,您可以使用以下命令克隆 IBM Cloud 的 swift-helloworld 应用程序

git clone https://github.com/IBM-Bluemix/swift-helloworld.git

然后使用以下命令推送 swift-helloworld 应用程序

bx app push

成功推送应用程序后,您需要将之前创建的服务绑定到新应用程序,然后重新暂存应用程序

bx service bind swift-helloworld cf-dummy-service

bx app restage swift-helloworld

重新暂存应用程序后,您可以访问分配给应用程序的路由(即 URL),您应该看到各种 Swift-cfenv 调用的输出。

许可证

此 Swift 包在 Apache 2.0 许可下获得许可。完整的许可文本可在 LICENSE 中找到。