外部ネットワークなしでノードで構築されたサービスを簡単にデプロイする方法は? 自己検索と実践を通じて、適切なテクノロジを見つけました.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 をパッケージ化することは難しくありません。パッケージ化して実行することができます。