pkgのパッケージノードサービス

       外部ネットワークなしでノードで構築されたサービスを簡単にデプロイする方法は? 自己検索と実践を通じて、適切なテクノロジを見つけました.pkgは、サービスをexeファイルにパッケージ化できるため、展開に便利です.コードのセキュリティを確保するだけでなく、ユーザーが1つで操作できるようにすることもできます.クリック。

1. 情報を検索することによって、接触するテクノロジーは次のとおりです。

     1. pm2: 習得しやすいプロセス管理ですが、これでは求める結果が得られません

     2. pkg: いいやつ、これが私の欲しいものじゃない! ! pkg は、バイナリ実行可能ファイルをコンパイルするためのツールです。npm で検索して学習できます: pkg - npm

     3. その他: nexe、node-packer、enclose、これらはほんの一部です

2、パッケージの原則:

        実際、pkg はプログラムを直接実行可能ファイルに変換するのではなく、ノード環境をプログラムにパッケージ化するため、ノード環境のないコンピューターでノード プロジェクトを実行する必要はありません。詳細を知る必要がある場合は、このケースノード プロジェクトが実行可能ファイル pkg (1) にパッケージ化されていることを確認できます: pkg の紹介 - ナゲット

3.利点:

        1. exe ファイルを出力します。使用法とパッケージングに応じて、freebsd、linux、alpine、macos、win で実行できます。注: パッケージ化するときは、パッケージング環境を確認してください。たとえば、win では、win 実行可能パッケージのみをパッケージ化できます。

        2.ノード環境の外では、多数の依存関係をインストールする必要はありません

        3.外部ネットワークから分離され、使用するためにインターネットに接続する(切断される)必要はありません

        4. コード流出を防ぐため、お客様にはexeファイルのみをお渡ししており、すべてのコードを公開する必要はありません

        これが私が pkg を選んだ理由です。では、実装手順と私が遭遇した落とし穴について話しましょう

4.ステップを使用する

1. pkg をグローバルにインストールする

npm install -g pkg

2.構成

package.json の下に設定します

(1) エントリーファイル

     パッケージングを実行する pkg の原則は、エントリ ファイルから開始し、関連する依存関係に従ってパッケージング プロセスを実行するために vine をたどることです. 明らかに、エントリ ファイルはノード アプリケーション自体と同じです。構成ファイル package.json で、bin 属性を追加して、pkg の実行エントリを具体的に指定する必要があります。入力方法は多数あります。

// package.json
{
...
"bin": "./bin/www",
"bin": "./service.js"
...
}

(2) パッケージングコマンド

パッケージの実行は、最も重要なパッケージング アクションです. たとえば、ここで使用する構成行は次のように記述されます。

  "scripts": {
    "dist": "pkg . --out-path=dist/ --targets=win --compress=GZip"
  },

pkg .  : 指定したディレクトリで package.json ファイルを検索し、エントリ ファイルとして bin フィールドを検索します。

-t または -targets   : パッケージ化されたターゲット プラットフォームとノード バージョンを指定します。たとえば、-t node6-win-x64、node6-linux-x64、node6-macos-x64 は、3 つのプラットフォームの実行可能プログラムを同時にパッケージ化できます。

-o  : 出力実行可能ファイルの名前を指定します

--out-path : 出力ディレクトリを指定

--compress : パッケージング後の圧縮形式

(3) jsと静的ファイル

これはより重要です. 前述のように, pkg パッケージングは​​依存関係に基づいて関連するリソースを見つけるために入口から開始し, それらをすべてパッケージ化します. ただし, 直接パッケージングは​​参照を必要とする場合に限られます. コードが __dirname スプライシングを使用している場合変数は、packge.json で構成する必要があります。

例: プロジェクトの __dirname を使用してビューとパブリック ファイルを読み取る

app.set('views',path.join(__dirname, './views'))
app.use(express.static(path.join(__dirname, './public')));

ビューとパブリック フォルダー内のファイルは、pkg によって自動的にパッケージ化されないため、次のように構成する必要があります。

{ 
    "script": {}, 
    "pkg": { 
        "assets": ["public/**/*","views/**/*"], 
        "scripts": "workers/**/*.js" 
    }, 
}

assets : public/**/* などの静的リソースに関連する構成を示します。これは、public の下のすべてのファイルがパッケージ化されていることを意味します。

scritps : パッケージ化するために構成する必要がある js スクリプトを示します

3. 梱包

npm run dist

パッケージ化が成功すると、プロジェクトの dist ファイルの下に余分な xxx.exe ファイルが作成されます。

五、遭遇した落とし穴

1.ノードとキャッシュのバージョンについては、この大物の記事を参照できます

exe_Li Jiang~ のブログ - CSDN blog_pkg パッケージとしての pkg パッケージ ノード プロジェクト

2. ファイルの欠落、静的ファイルの読み取り失敗

pkg は、require、__dirname、__filename、および process.cwd によってロードされたファイルのみを認識します。

アセットで __dirname および __filename を構成する必要があります

process.cwd は外部ファイルを読み取ります。たとえば、プロジェクトには読み取りが必要なデータベース ファイルがあります。データベース ファイルとパッケージ化された exe ファイルをまとめて、process.cwd を介して読み取ります。

上記の4つの他の書き込み方法に加えて、それを読み取ることはできません

__dirname和__filename的区别

__dirname:D://work/service/data
__filename:D://work/service/data/index.js

3. データベースファイルの読み込みに失敗しました

process.cwd は外部ファイルを読み取ります。たとえば、プロジェクトには読み取りが必要なデータベース ファイルがあります。データベース ファイルとパッケージ化された exe ファイルをまとめて、process.cwd を介して読み取ります。

6. まとめ

        おそらく、私のような多くの友人は、Node.js について深い知識を持っていないため、難しいと感じるでしょう。どちらの方法 (勉強または仕事) に触れる必要がある場合でも、辛抱してください。要件に従って構成されている限り、pkg をパッケージ化することは難しくありません。パッケージ化して実行することができます。


 

おすすめ

転載: blog.csdn.net/m0_55173487/article/details/128015052