Skip to content

Conversation

qryxip
Copy link
Member

@qryxip qryxip commented Jan 6, 2023

内容

TypeScriptの練習がてら、Deno版のダウンローダーを書いてみたのでここにぶら下げておきます。

PowerShell版のダウンローダーのメンテが厳しいのではないかという話がDiscordであったと思うのですが、Deno版ダウンローダーはそれに対する解決策の一つになると思います。利点としては次の4点でしょうか。

  1. コマンド一発でEXEにコンパイルして配布できる
  2. 言語自体はTypeScriptなので読み書きできる人が多そう
  3. (Bashと比べて) エラーのときにちゃんとメッセージを出して停止することが保証しやすい
  4. (主にBashと比べて) 単一ファイルのまま外部ライブラリを気軽に導入できる
    • 標準ライブラリに何でも入っているPythonやPowerShell (Core)はともかく、Bashだと例えばjqを気軽に要求できないためにJSONを扱えなかったりします。

関連 Issue

その他

image

image

tree ./voicevox_core
./voicevox_core
├── EULA.txt
├── libcublasLt.so.11
├── libcublas.so.11
├── libcudnn_adv_infer.so.8
├── libcudnn_cnn_infer.so.8
├── libcudnn_ops_infer.so.8
├── libcudnn.so.8
├── libcufft.so.10
├── libcurand.so.10
├── libonnxruntime_providers_cuda.so
├── libonnxruntime_providers_shared.so
├── libonnxruntime_providers_tensorrt.so
├── libonnxruntime.so.1.11.1
├── libvoicevox_core.so
├── NVIDIA_SLA_cuDNN_Support.txt
├── open_jtalk_dic_utf_8-1.11
│   ├── char.bin
│   ├── COPYING
│   ├── left-id.def
│   ├── matrix.bin
│   ├── pos-id.def
│   ├── rewrite.def
│   ├── right-id.def
│   ├── sys.dic
│   └── unk.dic
├── README.txt
├── VERSION
└── voicevox_core.h

2 directories, 27 files

@qryxip qryxip marked this pull request as draft January 6, 2023 09:54
Copy link
Member

@Hiroshiba Hiroshiba left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

とりあえずダウンローダーを置き換えるかの議論はいったん置いときまして!

TypeScriptは環境構築が大変なイメージがあるんですよね・・・。
ダウンローダーのために環境構築周りも頑張らないといけないようになるのをどうしたもんかという気持ちです!

@qryxip
Copy link
Member Author

qryxip commented Jan 7, 2023

VSCodeの設定

VSCode向けの環境構築手順はおそらく以下の通りになります。

  1. deno(.exe)をどっかから持って来て$PATHに入れる

    公式が推奨するインストール方法

    deno(.exe)さえあればいいので、GitHub Actionsから持って来るなりしてもよいです。なんならcargo installでも普通に入ります。Denoにはセルフアップデート機能があるので、適当な入れ方をして適当な場所に置いても特に問題はないはず。

    あとLinuxディストロによっては標準のパッケージマネージャーに入っていることがあります。

    deno(.exe)にフォーマット機能もリント機能も同梱されているので、スクリプトを動かすだけならここまででも十分かと思います。

  2. denoland.vscode-denoをインストール

    この拡張機能はdeno(.exe)を同梱しません。そのため1.の手順は必須です。

  3. VSCodeのワークスペースを設定

    Denoが拡張子に.tsを用いていることもあり、vscode-denoはデフォルトでは動作しないようになっています。そのため次のどちらかを設定する必要があります。

    • Denoのことだけを考えればよいリポジトリの場合: "deno.enable": true
    • Node.jsも使うリポジトリの場合: "deno.enablePaths": [...Nodeではない、Denoのスクリプトへのパス]

    .vscode/settings.jsonをこのリポジトリに入れればこの手順はスキップできるのですが、このファイルは通常gitignoreして個々人が自分用の設定を追加するのが慣習的なのではないかとも思っています。私は普段Python以外にVSCodeを使っていないので、この辺の感覚がよくわかっていません。

VSCode以外の設定

VSCode以外だと、どちらかというとNode.js用設定との共存が面倒かなと思っています。

私はNeovimでnvim-lspconfigを使っているのですが、以下の設定で少なくともリポジトリ単位での使い分けはなんとかなっています。

local lspconfig = require('lspconfig')

lspconfig.denols.setup {}

lspconfig.tsserver.setup {
  root_dir = lspconfig.util.root_pattern("package.json", "tsconfig.json", "jsconfig.json"),
  single_file_support = false,
}

nvim-lspconfig以外の(Neo)Vimの設定例として、Node.jsとDenoを両方使っていらっしゃるであろうNanashi.さんとらぁさんの設定も見てみたのですが、馴染みがないのでよくわからなかったです。

@sevenc-nanashi
Copy link
Member

自分はcoc-tsdetectを使っていますね。(参照:coc-package.json:12

@qryxip
Copy link
Member Author

qryxip commented Jan 7, 2023

なるほどcocにはそんなのが…

@qryxip qryxip marked this pull request as ready for review January 7, 2023 21:40
@Hiroshiba
Copy link
Member

詳細ありがとうございます!!

正直なところ、Denoというかなりマイナーな環境を採用すべきなのかどうかという点でかなり迷っています。

・仕様周りが高頻度で変わるのではと思っていてメンテナンスコストが高くなりそう?
・補助スクリプトというあまり変化しなそうなところのために一風変わった環境を用意してもらう必要がある
・主にコマンド実行が役割だけどそのあたりが逆に大変になる(zip解凍など)

2つ目はボイボ全体のスクリプトをDenoにするなどすれば軽減しそうですが、大変だよなーと…。
まとまってなくて申し訳ないのですが、所感はこんなかんじです🙇‍♂️

@qwerty2501
Copy link
Contributor

実行可能バイナリで配布したいならRustで作ってしまったほうが良かったのでは?coreのメンテナの習熟度や環境構築のことを考えるとそのほうが良いように感じました

@qryxip
Copy link
Member Author

qryxip commented Jan 8, 2023

Rustで書くことも考えたのですが利用者にCargoのインストールを要求するため、それならdeno.exeさえあればよくて読み書きできる人が多そうなDenoの方が楽かなと思っていました。ただ考えてみるとGitHub Releasesからバイナリを配るのなら、利用者はランタイムをインストールする必要が全くもって無いんですよね。

Bash/Python/Deno(TypeScript)と比べるとRustを読み書きできる人は少なくなるというのも理由としてありましたが、それも極端な話私とqwertyさんとSuitCaseさんができればいいわけですし。

私個人としてはRustで書いたとしてもBashやPythonやDenoと比べ、読み書きしやすさが低下するという感覚は無いです。もしRustでもよいのなら、このPRを即座にcloseしてRustで書き直す用意はできています。

Copy link
Member

@sevenc-nanashi sevenc-nanashi left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(ちょっと気になったところをコメントしてみました)

@qwerty2501
Copy link
Contributor

@qryxip そうですね。cargoのインストールが必要なのは利用者ではなく開発者なのでRustで書いても配布については問題ないはずです。
開発についてもそもそもこのリポジトリで貢献しようとする人はcargoをインストールしてるはずなので問題ないと思います。
最終的な判断はhihoさんになるとおもいますが

Co-authored-by: Nanashi. <sevenc_nanashi@yahoo.co.jp>
@Hiroshiba
Copy link
Member

Hiroshiba commented Jan 9, 2023

うーーーーーん、判断が難しいですね!!

正直なところ、シェルスクリプトでも十分可能なことをRustで書くのは流石にオーバースペック感あります。
ビルド周りも含めないとなので、シェルスクリプトに比べてメンテコストは同じくらいかちょい高いくらいかなという直感です。
あと今思えばlatest版ビルドを用意できてないのでちょい大変になりそうです。

モチベは shell script >>> Rust > Deno って感じです。(shell scriptが高いのはすでにあるからです。)
できれば、今できてないとこを作るのに注力したい気持ちがあります。(DirectMLのGPU自動選択を良くするとか。)

という総合判断でたぶんやめたほうがいいだろうなという直感です…!🙇‍♂️
(latestビルドが無いというのが一番のボトルネックかなと…!気付くのが遅れて申し訳ないです…🙇‍♂️)

@Hiroshiba
Copy link
Member

いや、latest版がほしくなるのは主に開発者で、開発者はcargo使えるから自分でビルドできますね。
OS環境依存もある程度排除できるので、Rust化はありかもと感じてきました。

ちなみになのですが、いざとなったらシェルコマンドの実行が視野に入ってくると思います。
Rustからコマンドを叩くのは難しかったりしますか・・・? 👀

@qryxip
Copy link
Member Author

qryxip commented Jan 9, 2023

こんな感じでいけるのではないかと。

use std::path::Path;

use duct::cmd;

fn extract_tgz(tgz: &Path, extract_dir: &Path) -> anyhow::Result<()> {
    cmd!("tar", "xvf", tgz, "-C", extract_dir, "--strip-components=1").run()?;
    Ok(())
}

@Hiroshiba
Copy link
Member

なるほどです、簡単そうですね!!
Rustでダウンローダー、ありな気がしてきました!もしよければPR頂ければ!!

もし万が一実際のコードがあまりにも複雑に感じたら再考で…!🙇‍♂️
(よっぽどのことがない限り大丈夫かなという気持ちです)

@qryxip
Copy link
Member Author

qryxip commented Jan 10, 2023

はい。今晩作ってみようかと思います

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants