2021年6月14日月曜日

deno compileで作った実行ファイルからdeno本体を除去したり戻したりするスクリプト

denoをインターネット接続環境が無いPCで使用する方法を先日投稿しました。
しかし、上記投稿の方法では、はっきり言って面倒臭いです。
もっと簡単かつシンプルな方法がありました。



注意事項として、この記事に記載されている内容はdenoのバージョンが変わると通用しない可能性があります。
deno v1.10.2で動作確認していますが、このバージョンなら あらゆるスクリプトに適用できるか、ということも分かりません。
試してみたら動きました、という内容です。
実行する際は自己責任でお願いします。



先日公開した方法の問題点は以下です。
  • compileする前にキャッシュフォルダ内を空にしておかないと、余分なキャッシュまで含んでしまう。
  • ユーザアカウント毎にキャッシュファイルのコピー作業が必要になってしまう。



以下の投稿を読んだのがきっかけで、今回の試みを計画しました。
Deno1.6.0 で入った deno compile のコードを読んでみる



コンパイル後に出来上がる実行ファイルのサイズとdenoのファイルサイズからして、そうなのだろうとは思っていましたが、やはりコンパイル後の実行ファイルにはdenoが丸々入っているようです。
というか、deno.exeの後ろにコンパイル済みコードとトレーラーがくっつけられただけのような感じ。

そういう事なら、コンパイルして出来上がった実行ファイルの末尾だけを切り出しておいて、実行したい時にそのファイルをdeno.exeの後ろにくっつけて起動させれば使えるような気がします。



というわけで、上記を行うためのソースが以下。
※すべてSJIS形式で保存する必要があります。ソースファイル内で全角文字を使用しなければ、おそらくUTF-8でもエラーにはなりませんが、個人的な趣味を優先しました。
@(
echo $deno = "deno.exe"
echo $exe = "%~1"
type "分割.ps1"
) | powershell -command -
comp deno.exe "%~1.deno.exe" /M
pause
view raw bat分割.bat hosted with ❤ by GitHub
@(
echo $deno = "deno.exe"
echo $code = "%~1"
type "結合.ps1"
) | powershell -command -
"%~1.exe"
pause
view raw bat結合.bat hosted with ❤ by GitHub
function Split-Content() {
Param(
[string]$PathDeno,
[string]$Path
)
$srcDeno = New-Object System.IO.FileInfo($PathDeno)
$src = New-Object System.IO.FileInfo($Path)
$readストリーム = $src.OpenRead()
$先頭サイズ = $srcDeno.Length
$終端サイズ = $src.Length - $先頭サイズ
function writeByte{
Param($バイト数, $ファイル名の末尾)
$buf = New-Object byte[] $バイト数
$バイト数 = $readストリーム.Read($buf, 0, $バイト数)
$writeストリーム = New-Object System.IO.FileStream(($Path + $ファイル名の末尾), 'Create')
$writeストリーム.Write($buf, 0, $バイト数)
$writeストリーム.Dispose()
}
writeByte $先頭サイズ '.deno.exe'
writeByte $終端サイズ '.denoApp'
$readストリーム.Dispose()
$dst = New-Object System.IO.FileInfo($Path + '.denoApp')
$dst.LastWriteTime = $src.LastWriteTime
$dst.Attributes = $src.Attributes
}
Split-Content $deno $exe
view raw 分割.ps1 hosted with ❤ by GitHub
function Split-Content() {
Param(
[string]$PathDeno,
[string]$PathCode
)
$src = New-Object System.IO.FileInfo($PathCode)
$path出力 = $PathCode+'.exe'
$dstFs = New-Object System.IO.FileStream($path出力, 'Create')
$buf = [System.IO.File]::ReadAllBytes($PathDeno)
$dstFs.Write($buf, 0, $buf.Length)
$buf = [System.IO.File]::ReadAllBytes($PathCode)
$dstFs.Write($buf, 0, $buf.Length)
$dstFs.Dispose()
$dst = New-Object System.IO.FileInfo($PathCode+'.exe')
$dst.LastWriteTime = $src.LastWriteTime
$dst.Attributes = $src.Attributes
}
Split-Content $deno $code
view raw 結合.ps1 hosted with ❤ by GitHub



まずコンパイルします。



出来上がった実行ファイルを「bat分割.bat」にドラッグ&ドロップします。



実行ファイルの先頭側がdeno.exeと完全に一致していることがcompコマンドで確認できます。



「bat分割.bat」実行時に作成された「アプリ名.denoApp」を「bat結合.bat」にドラッグ&ドロップします。



「deno.exe」の後ろに「アプリ名.denoCode」を結合すると同時に、それが実行されます。



「bat_分割.bat」で出来上がる「denoApp」ファイルはとても小さくて良い感じです。



他のスクリプトでも動作確認しました。

空いてるportを調べる.ts
上記プログラムの「denoApp」ファイルのプロパティが以下。



webSocket接続して切れるまで待つ

0 件のコメント:

コメントを投稿