亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Rust?搭建一個小程序運行環(huán)境的方法詳解

 更新時間:2022年05月23日 14:07:03   作者:Finbird  
rust是一門比較新的編程語言,2015年5月15日,Rust編程語言核心團隊正式宣布發(fā)布Rust?1.0版本,本文給大家介紹Rust?搭建一個小程序運行環(huán)境,以iOS?為例介紹開發(fā)環(huán)境的準備,感興趣的朋友跟隨小編一起看看吧

搭建一個FinClip社區(qū)版docker運行環(huán)境,安裝設置Rust開發(fā)編譯iOS代碼的環(huán)境,設置xcode的項目配合,集成FinClip SDK,準備好實現(xiàn)從FinClip小程序到Rust算法邏輯的端到端融合。

本篇以 iOS 為例介紹開發(fā)環(huán)境的準備。

從零到一:構(gòu)建一個能運行小程序的App

我們先從FinClip官網(wǎng)下載最新的FinClip SDK,解壓后應獲得 FinApplet.framework、FinAppletExt.framework、FinAppletWebRTC.framework、FinAppletBLE.framework 等一系列庫。

用 xcode 創(chuàng)建一個新項目,簡單起見我們建一個基于 Objective-C 的 Storyboard。

此處注意,我們要小心命名這個 App 并記住它的 Bundle ID,如下圖,我們這個App 的 Bundle ID 是 com.finogeeks.rustful.clip。

然后把 FinClip SDK 解壓包里的 FinApplet.framework 添加至工程里,注意勾選“Copy items if needed”。

在macOS 11.1以上使用xcode較新的版本(筆者所用版本為13.0)編譯上述項目,會出現(xiàn)報錯無法繼續(xù),如果你有這個情況,可在項目Build Settings處作以下配置。

clip.xcodeproj Building for iOS Simulator, but the linked and embedded framework 'FinApplet.framework' was built for iOS + iOS Simulator

報錯信息

Apple 從 Xcode 12.3 開始推薦使用 xcframework 替代 Framework,本文所依賴的FinClip SDK 2.36.5 尚未提供 xcframework 版本,所以有上述問題,編譯過程且有系列warning,但不影響運行。在未來版本應會被解決。

FinClip SDK 中包含 x86_64 架構(gòu),便于我們開發(fā)時用模擬器調(diào)試。本文主要目的是試驗在 iOS 上 FinClip 小程序和 Rust 代碼的集成,以能運行在 simulator 為要。但是x86_64 架構(gòu)的 SDK,打包上傳應用市場時會報錯,如何打包時自動去除模擬器架構(gòu)的腳本,可以讓我們既可以用模擬器開發(fā)調(diào)試,又能正常提交應用市場,不在本文探討范圍,詳情可參考官網(wǎng)iOS集成。

FinClip 安全沙箱的初始化

FinClip SDK 代碼庫成功編譯構(gòu)建至 App后,是時候進行代碼集成。這里包括注冊生成 SDK Key 和 SDK Secret,用最少至僅 4 行代碼即可在 App 中把 FinClip SDK 初始化,準備好加載運行 FinClip 小程序。

獲得 SDK Key 以及 SDK Secret 的兩種方式

FinClip 技術分成端側(cè)和云(服務器)側(cè)兩大部分,端側(cè)即 FinClip SDK,云(服務器)側(cè)則是 FinClip 小程序管理中心/小程序商店,用于實時、動態(tài)管理小程序的上下架以及小程序開發(fā)者的管理(正如你所熟悉的互聯(lián)網(wǎng)小程序平臺一樣)。凡泰極客提供整套方案的兩種部署使用方式:

  • FinClip.com Managed Service 方式:即由凡泰極客運行云側(cè),開發(fā)者把小程序的上下架管理托管。從而降低自己在服務器端的運維成本
  • On-Premise 方式:即由開發(fā)者或開發(fā)者所在的機構(gòu),自行部署運維FinClip服務器側(cè),自行管理自己的開發(fā)者,自行管控自己的小程序開發(fā)生態(tài)。普通開發(fā)者也可以自行免費體驗和使用社區(qū)版(功能和企業(yè)版版無異),在一臺個人電腦即可以運行完整環(huán)境。

取決于我們打算用誰的服務器端,則 SDK Key 和SDK Secret 需要在該服務器生成,因為最終 App 所嵌入的 SDK 需要被所連接的目標服務器作安全授權(quán)。

方式一:采用 FinClip.com 托管服務

這是最簡單直接的方式,也就是說我們準備開發(fā)的小程序,將上架至 FinClip.com。(注意:本系列所描述內(nèi)容的驗證,需要使用自己部署安裝的社區(qū)版。FinClip.com服務在此為了完整起見作簡單介紹)。

首先,需到 FinClip.com 注冊一個開發(fā)者賬戶

其次,登錄后在管理頁面「應用管理-新增合作應用」,添加要集成 SDK 的目標應用。

具體操作詳情見關聯(lián)移動端應用

你將獲得類似以下的 Key 和 Secret:

準備把它們粘貼、復制至初始化的代碼中。

方式二:自行部署 FinClip 社區(qū)版

如果閣下按捺不止自己動手搭建一套 FinClip、擁有一個自己掌控的小程序商店,那么也可以輕而易舉的在自己的開發(fā)環(huán)境部署個社區(qū)版(作為前置條件,注意先安裝好 docker 相關工具):

mkdir my-finclip
cd my-finclip
sudo sh -c "$(curl -fsSL https://static.finogeeks.club/deploy/mop/release/install.sh)"

成功安裝后,在上述目錄下運行:

docker-compose up -d

假如你用 MacOS 上的 Docker Desktop,打開 Dashboard 應能看到下圖,其中每一個 container 都應該處于 running 狀態(tài)(除了mop-init "EXITED(0)" 為正常)。

此時 FinClip 管理后臺(分成面向開發(fā)者的“企業(yè)端”以及面向運營管理者的“運營端”)可通過以下 URL 訪問:

登錄企業(yè)端與運營端的默認用戶名為“finclip@finogeeks.com”,密碼為“123Abc”。

首先,我們自己扮演管理角色,在運營端登記自己準備開發(fā)移動端應用的 Bundle ID,Bundle ID 是你在 Apple App Store 或者某個 Android 應用商店準備發(fā)布的 App 的應用標識。

在這里作為例子,我們新增了一個 Bundle ID "com.finogeeks.rustful.clip"(記得之前在 Xcode 創(chuàng)建 App 的時候所定義的名字):

輸入后在 FinClip 也關聯(lián)了同樣的 Bundle ID

其次,我們扮演開發(fā)者角色,到企業(yè)端中,添加一款合作應用,姑且稱之為 rust-ios,并關聯(lián)相應的 Bundle ID:

至此,我們把以下信息關聯(lián)了起來:

  • 我們要開發(fā)的 App 名稱,在這個例子里,叫“rust-ios”
  • 這個 App 的 Bundle ID 是:com.finogeeks.rustful.clip,它將適用于iOS和Android,雖然在本文我們只針對 iOS 作開發(fā)。我們首先是在xcode創(chuàng)建項目的時候采用了這個 ID,現(xiàn)在我們把它登記到 FinClip,目的是讓平臺知道一個小程序可以運行在什么 App 中;
  • FinClip SDK 嵌入到這個 App 時,需要使用一對指定的 Key 以及 Secret 去對接服務器端
  • 服務器端,取決于你用的是 FinClip.com的托管/SaaS 服務,還是用自己部署的社區(qū)版。前者的 API Server是api.finclip.com;后者的話,缺省是127.0.0.1:8000。

FinClip SDK 在 App 中的初始化

現(xiàn)在我們準備好在 Xcode 創(chuàng)建的 clip 項目中寫初始化 SDK 的代碼。在AppDelegate.m,加入以下代碼:

//
//  AppDelegate.m
//  clip
//
#import "AppDelegate.h"
#import <FinApplet/FinApplet.h>
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    NSString *appKey = @"22LyZEib0gLTQdU3MUauARgvo5OK1UkzIY2eR+LFy28NAKxKlxHnzqdyifD+rGyG";
    FATConfig *config = [FATConfig configWithAppSecret:@"8fe39ccd4c9862ae" appKey:appKey];
    config.apiServer = @"http://127.0.0.1:8000";
    [[FATClient sharedClient] initWithConfig:config error:nil];
    [[FATClient sharedClient] setEnableLog:YES];
    return YES;
}
#pragma mark - UISceneSession lifecycle
- (UISceneConfiguration *)application:(UIApplication *)application configurationForConnectingSceneSession:(UISceneSession *)connectingSceneSession options:(UISceneConnectionOptions *)options {
    // Called when a new scene session is being created.
    // Use this method to select a configuration to create the new scene with.
    return [[UISceneConfiguration alloc] initWithName:@"Default Configuration" sessionRole:connectingSceneSession.role];
}
- (void)application:(UIApplication *)application didDiscardSceneSessions:(NSSet<UISceneSession *> *)sceneSessions {
    // Called when the user discards a scene session.
    // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
    // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
}
@end

Rust 開發(fā)環(huán)境的準備

安裝R ust 環(huán)境比較簡單,例如在 Mac/Linux上,一行腳本即可:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

其他相關內(nèi)容可參考官網(wǎng)。

為了能把 Rust 代碼編譯成 iOS、Android 的組件庫,我們需要安裝一些平臺架構(gòu)的target:

# Android targets
rustup target add aarch64-linux-android armv7-linux-androideabi i686-linux-android x86_64-linux-android
# iOS targets
rustup target add aarch64-apple-ios armv7-apple-ios armv7s-apple-ios x86_64-apple-ios i386-apple-ios

此外,我們還需要安裝兩個工具,用于構(gòu)建 iOS 的 universal library,以及從 Rust 代碼生成 C/C++ 頭文件,供 Objective-C/Swift 的項目在導入靜態(tài)庫時使用:

# 安裝 Xcode build tools(如果已經(jīng)安裝,請忽略)
xcode-select --install
# 這個cargo subcommand用于構(gòu)建iOS上的universal library
cargo install cargo-lipo
# 這個工具用于自動生成 C/C++11 頭文件
cargo install cbindgen
# 在Android環(huán)境,請先安裝Android Studio和NDK,但不在本文討論范圍
cargo install cargo-ndk

關于 cargo-lip 的介紹,可以看這里,關于 cbindgen,可以參考這里。但實際上你也可以以后有興趣慢慢看,知其然不知其所然在這里沒毛病,不影響使用。

Rust 代碼編譯成 iOS 靜態(tài)庫的驗證

在開始正式的開發(fā)前,我們可以寫一個簡單的“Hello World”驗證一下上述環(huán)境。首先用 cargo 創(chuàng)建一個新的 Rust 的 Library 工程類型的項目,原因是我們會把這個library 導入到 iOS 的項目中并把其中函數(shù)注冊至 FinClip SDK 供小程序側(cè)通過 JavaScript 接口調(diào)用。

cargo new --lib hello

Cargo 自動生成以下目錄:

hello
   |--src
   |    |--lib.rs
   |--Cargo.toml

我們的 Cargo.toml 如下:

[package]
name = "rustylib"
version = "0.1.0"
authors = ["me <finclip@finogeeks.com>"]
edition = "2021"
[lib]
name = "rustylib"
# 構(gòu)建iOS和Android版本需要的兩個crate
crate-type = ["staticlib", "lib"]
# 編譯Android版時需要,本文不涉及,但列出在此供Android開發(fā)者參考
[target.'cfg(target_os = "android")'.dependencies]
jni = { version = "0.19.0", default-features = false }

現(xiàn)在我們修訂一下 lib.rs。因為這個實驗項目并不是為了簡單跑一個 Rust 'Hello World',而是為了驗證輸出一個可以供異構(gòu)語言調(diào)用的 C Library,所以在這里我們用了 Rust FFI(Foreign Function Interface)來寫(看上去比“正常”的'Hello World'復雜):

// lib.rs
use std::ffi::{CStr, CString};
use std::os::raw::c_char;
#[cfg(target_os = "android")]
mod android;
#[no_mangle]
pub unsafe extern "C" fn hello(to: *const c_char) -> *mut c_char {
    let c_str = CStr::from_ptr(to);
    let recipient = match c_str.to_str() {
        Ok(s) => s,
        Err(_) => "you",
    };
    CString::new(format!("From Rust: {}", recipient))
        .unwrap()
        .into_raw()
}
#[no_mangle]
pub unsafe extern "C" fn hello_release(s: *mut c_char) {
    if s.is_null() {
        return;
    }
    drop(CString::from_raw(s));
}
#[no_mangle]
pub extern "C" fn hello_world() {
    println!("Hello, World");
}

Rust 編譯器編譯代碼時,會修改我們定義的函數(shù)名稱,增加一些用于其編譯過程的額外信息。為了使 Rust 函數(shù)能在其它語言(例如Objective-C、Swift)中被調(diào)用,必須禁用 Rust 編譯器的名稱修改功能。所以我們使用了 no_mangle 的函數(shù)屬性聲明去指示編譯這些準備注冊到 FinClip SDK 的函數(shù)。

另外,我們還使用了 extern "C"的聲明,以告知編譯器這些被如此聲明的函數(shù)是為了供 Rust 以外的其他語言代碼調(diào)用,編譯器需要保證按C語言的標準規(guī)范去編譯輸出。

其他更多關于 FFI(Foreign Function Interface)以及 unsafe 等 Rust 語言的能力,不是本文焦點,可參考 Rust 相關方面的內(nèi)容。在本系列后面的章節(jié)也會繼續(xù)涉及。

為了能驗證一下上述函數(shù)能否運行,我們編寫一個測試例子:

cd hello
mkdir examples
touch examples/test.rs

一個簡單的測試如下:

// test.rs
use std::ffi::{CStr, CString};
use rustylib::{hello, hello_release};
fn main() {
    let input = CString::new("Hello, world!").unwrap();
    unsafe {
        let c_buf = hello(input.as_ptr());
        let slice = CStr::from_ptr(c_buf);
        println!("{}", slice.to_str().unwrap());
        hello_release(c_buf);
    }
}

在 hello 項目的根目錄下,運行測試:

cargo run --example test

應產(chǎn)生如下結(jié)果:

Blocking waiting for file lock on build directory
Compiling rustylib v0.1.0 (/Users/myself/projects/hello)
Finished dev [unoptimized + debuginfo] target(s) in 5.89s
Running `target/debug/examples/test`
From Rust: Hello, world!

現(xiàn)在可以嘗試為 iOS 進行編譯:

$ cargo lipo --release

我們可以檢查一下生成的靜態(tài)庫:

lipo -info target/aarch64-apple-ios/release/librustylib.a                         Non-fat file: target/aarch64-apple-ios/release/librustylib.a is architecture: arm64
ipo -info target/x86_64-apple-ios/release/librustylib.a                       
Non-fat file: target/x86_64-apple-ios/release/librustylib.a is architecture: x86_64

但我們用于開發(fā)的是一個合并了上述兩個架構(gòu)的通用庫 Fat library,在以下目錄中:

ls -l target/universal/release/librustylib.a

要在 iOS 驗證這部分代碼,可以先生成一個 C 的頭文件,在 hello 這個 Rust 項目的根:

cbindgen src/lib.rs -l c > rustylib.h

然后把這個頭文件添加至AppDelegate.m,再對其進行修訂,把'hello'和'hello_release'直接按C的方式調(diào)用一下即可。代碼非常簡單,不在此贅述。但是在xcode中需要把上述生成的librustylib.a以及rustylib.h添加至項目中(如果不是iOS開發(fā)者不熟悉xcode,可以跳過本部分驗證,繼續(xù)閱讀本系列后續(xù)篇章的詳細介紹)。

至此,我們把iOS Native App、FinClip SDK和Rust library三個部分集成起來,接下來的內(nèi)容,將是聚焦開發(fā)一個比“Hello World”復雜點的、確實適合用Rust實現(xiàn)的library,并讓它通過FinClip小程序來展現(xiàn)人機交互的界面。開發(fā)過程所用到的工具有點多,你需要:

  • xcode:用于編譯構(gòu)建“殼”應用,以及通過simulator測試你的應用
  • FinClip IDE:用于開發(fā)調(diào)試小程序
  • FinClip.com(或者運行在你本地電腦上的FinClip社區(qū)版)的企業(yè)端和運營端
  • vscode以及一些有助于開發(fā)測試Rust代碼的extension(當然,你也可以用其他vscode替代工具)

對于首次開發(fā)Rust的朋友,在vscode推薦安裝以下extension:

  • Better TOML,用于支持Cargo.toml文件的syntax highlight
  • crates,用于支持Cargo.toml中crate的版本依賴關系管理
  • rust-analyzer,似乎優(yōu)于官方的rust extension
  • CodeLLDB,能支持C++、Rust等編譯語言的debugger
  • Tabnine AI Auto-complete,一句話,智能好使

到此這篇關于Rust 搭建一個小程序運行環(huán)境的文章就介紹到這了,更多相關Rust 小程序運行環(huán)境內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Rust中的不安全代碼詳解

    Rust中的不安全代碼詳解

    這篇文章主要為大家介紹了Rust中的不安全代碼詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • rust中間件actix_web在項目中的使用實戰(zhàn)

    rust中間件actix_web在項目中的使用實戰(zhàn)

    這篇文章主要介紹了rust中間件在項目中的使用實戰(zhàn),包括自定義中間件,日志中間件,Default?headers,用戶會話,錯誤處理的用法實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • 詳解在Rust語言中如何聲明可變的static類型變量

    詳解在Rust語言中如何聲明可變的static類型變量

    在Rust中,可以使用lazy_static宏來聲明可變的靜態(tài)變量,lazy_static是一個用于聲明延遲求值靜態(tài)變量的宏,本文將通過一個簡單的例子,演示如何使用?lazy_static?宏來聲明一個可變的靜態(tài)變量,需要的朋友可以參考下
    2023-08-08
  • Rust實現(xiàn)grep命令行工具的方法

    Rust實現(xiàn)grep命令行工具的方法

    這篇文章主要介紹了Rust實現(xiàn)grep命令行工具的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • 一文弄懂rust生命周期

    一文弄懂rust生命周期

    生命周期是Rust語言中的一個概念,用于決內(nèi)存安全問題,本文主要介紹了一文弄懂rust生命周期,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • rust生命周期詳解

    rust生命周期詳解

    生命周期是rust中用來規(guī)定引用的有效作用域,在大多數(shù)時候,無需手動聲明,因為編譯器能夠自動推導,這篇文章主要介紹了rust生命周期相關知識,需要的朋友可以參考下
    2023-03-03
  • Rust實現(xiàn)冒泡排序算法示例詳解

    Rust實現(xiàn)冒泡排序算法示例詳解

    這篇文章主要為大家介紹了Rust實現(xiàn)冒泡排序算法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • rust語言基礎pub關鍵字及Some語法示例

    rust語言基礎pub關鍵字及Some語法示例

    這篇文章主要為大家介紹了rust語言基礎pub關鍵字及Some語法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • 最新Rust錯誤處理簡介

    最新Rust錯誤處理簡介

    Rust并不像C++一樣使用try?catch的異常機制來進行錯誤處理,他將錯誤分為可恢復錯誤和不可恢復錯誤兩類,主要使用panic!宏和Result<T,E>類型來進行錯誤處理,這篇文章主要介紹了Rust錯誤處理簡介,需要的朋友可以參考下
    2022-11-11
  • Rust字符串匹配Rabin-Karp算法詳解

    Rust字符串匹配Rabin-Karp算法詳解

    Rabin-Karp算法也可以叫 Karp-Rabin 算法,它是用來解決多模式串匹配問題的,它的實現(xiàn)方式有點與眾不同,首先是計算兩個字符串的哈希值,然后通過比較這兩個哈希值的大小來判斷是否出現(xiàn)匹配,本文詳細介紹了字符串匹配Rabin-Karp算法,需要的朋友可以參考下
    2023-05-05

最新評論