Rust+Electronを使用したプラットフォーム間デスクトップアプリケーションの開発(一)


前言


最近Rustを勉强して、ずっと何かをして深く勉强したいと思っています.勉强したばかりなので、よく知らないところが多いので、それをコンパイラにすることはできません.これらについては、web开発については、実はこれを持って一つの言语を勉强することをお勧めしません.いくつかの面があります.一つは、web开発のやり方はそれだけで、一つの言语を勉强するのにあまり役に立ちません.第二に、web開発の多くはすでに多くのものをカプセル化されており、言語を学ぶこと自体に不利であり、本当に深く学ぶには言語そのものから出発し、できるだけカプセル化されたものを使わないことをお勧めします.もちろん、標準ライブラリを除きます.

なぜRust+Electronなのか


原因は実はとても简単で、私はあまり复雑なものをしたくなくて、大部分の精力はやはり仕事の上で置くため、次に私の日常の使うことができるものをすることを望んで、もちろん今まだよく考えていないで、音楽のプレーヤーかもしれなくて、天気の展示のappかもしれなくて、このように私は毎日使うことができて、これも更に动力があって私にそれを开発するように促します.
RustとElectronは私があまり紹介しなくてもいいでしょう.なぜこの組み合わせが知っているかという問題については、私が賛成している案は
C/Cpp/Rustを使用したコア+Electron/Qt開発インタフェース

今期の目標


今回の目標は非常に簡単で、RustとElectronを組み合わせて、Rustを使ってコンピュータのcpuコア数を取得し、Electronはデータをインタフェースに描画して展示します.

Electronプロジェクトの初期化


Electronプロジェクトの初期化私が使っているツールはelectron-forgeです.まずelectron-forgeの公式サイトの紹介に従います.
npm install -g electron-forge

electron-forge init my-new-project

cd my-new-project

electron-forge start

説明すると、まずelectron-forgeをインストールします.これはVue-cliのような足場ツールです.次に、my-new-projectというプロジェクトを初期化します.
この初期化の過程でelectron-forgeがpackageを構築することに注意してください.json、それからダウンロード依存、私が初めてダウンロード依存した時にelectron-runtimeにカードを入れて、2回目の再試行の時によかったです.
2つ目はelectron-forgeの依存がPythonバージョンに要求され、Python 2しか要求されません.ここで注意しなければならないのは、pyenvを使用してPythonバージョンを制御することをお勧めしません.以下のエラーが発生します.私の解決策はvirtualenvを使用してPython 2の環境を新規作成することです.
Fatal Python error: PyThreadState_Get: no current thread
プロジェクトの構造を見てみましょう
プロジェクト全体の構造は非常に簡単で、srcには私たちのソースファイル、indexがあります.htmlはインタフェースファイル、index.jsはインタフェースの論理ファイルで、indexを開きます.jsには、主にappを作成し、appのアクティビティを傍受する自動生成コードが表示されます.macの処理に注意する必要があります.
app.on('window-all-closed', () => {
  // On OS X it is common for applications and their menu bar
  // to stay active until the user quits explicitly with Cmd + Q
  if (process.platform !== 'darwin') {
    app.quit();
  }
});

では、プロジェクトを走り出して、プロジェクトディレクトリの下でelectron-forge startコマンドを実行しましょう.ちょっと待ってください.インタフェースが動作しています.
Rustプロジェクトの初期化
開発前に、JSはC++を直接実行できないようにRustを直接実行できないことを知っておく必要があります.そのため、RustをNodeモジュールにパッケージ化してJSに提供して呼び出す必要があります.だから私たちはneonを使ってこのことをします.neonのgithubアドレスはここにあります.
まずneonをインストールする必要があります.注意してください.neonはpythonバージョンにも要求があります.macであれば、pythonバージョンはPython 2でなければなりません.7、Python 3はサポートされていません.同様に、上記のno current threadの問題も発生します.そのため、virtualenvでPython 2の環境を新規作成したほうがいいです.
neonをインストールした後、neon new thread-countを実行し、プロジェクトを新規作成します.プロジェクトの構造を見てみましょう
libは私たちの最終的なエクスポートファイルで、electronに提供して呼び出します.nativeの下は私たちのrustコードです.ここのエントリファイルはnative/src/libです.rsは、実行可能なアプリケーションではなくライブラリを構築しているためです.まずプロジェクトをコンパイルし、ファイルディレクトリの下でneon build--releaseコマンドを実行します.
端末に入ってプロジェクトを呼び出してみましょう.
成功!これまでrustが書いたコードをnodeライブラリにカプセル化することに成功し、JSが呼び出されるようになりました.次に、上記に戻り、rustの機能をCPUコア数を取得するように変更し、関数にカプセル化してエクスポートします.
まずカーゴを修正しますtoml、[dependencies]でnum_を追加cpus="1.4.0"の依存項目を変更し、native/src/libを変更します.rsファイルは以下の通りです.
#[macro_use]
extern crate neon;

use neon::prelude::*;

fn thread_count(mut cx: FunctionContext) -> JsResult {
    Ok(cx.number(num_cpus::get() as f64))
}

register_module!(mut cx, {
    cx.export_function("thread_count", thread_count)
});

lib/indexを変更します.jsは以下の通りです.
var addon = require('../native');

module.exports = addon.thread_count;

次にコンパイルしてneon build--releaseコマンドを実行し、端末に入ってこの関数を呼び出してみましょう.
成功しました.これでrustコードをJSにカプセル化することに成功しました.rustをコンパイルするnodeバージョンはelectronを実行するnodeバージョンと一致する必要があります.そうしないと呼び出せない場合があります.はい、この第1期は終わりました.コードは暇を見つけてgithubに整理して、必要な学生に確認してもらいます.

効果


最後に効果図を見てみましょう
ps:今Rustの各ツールとライブラリはあまり成熟していないので、実践の過程でいろいろな問題に直面しているので、以下にコメントして一緒に議論することができます.