経緯
形態素解析の辞書ファイルをアップしたかったんだけど、ファイルが大きすぎてnpm publishができなかった。
https://www.npmjs.com/package/kuromoji-neologd
https://github.com/sushigadaisuki/kuromoji-ipadic-neologd
npm error code E413
npm error 413 Payload Too Large - PUT https://registry.npmjs.org/kuromoji-neologd - Payload Too Large
npm error A complete log of this run can be found in: C://xxxxx.log
概要
- Github releaseで圧縮してアップロード
- ファイルダウンロード、解凍するpostscriptを作成
- npm install したときに自動的にファイルがダウンロード、解凍される
1. Github releaseで圧縮してアップロード
こんな感じ
https://github.com/sushigadaisuki/kuromoji-ipadic-neologd/releases/tag/master
2. ファイルダウンロード、解凍するpostscriptを作成
postscript.js
import fetch from 'node-fetch';
import AdmZip from 'adm-zip';
import fs from 'fs';
import path from 'path';
import url from 'node:url';
// 変数
const __dirname = path.dirname(url.fileURLToPath(import.meta.url)); // 絶対パス取得
const file_url = 'https://github.com/sushigadaisuki/kuromoji-ipadic-neologd/releases/download/master/dict.zip';
const outputPath = path.resolve(__dirname, '.');
const zipPath = path.resolve(__dirname, 'dict.zip');
// ファイルダウンロード
async function downloadFile(file_url, dest) {
const res = await fetch(file_url);
if (!res.ok) throw new Error(`Failed to fetch ${file_url}: ${res.statusText}`);
const fileStream = fs.createWriteStream(dest);
await new Promise((resolve, reject) => {
res.body.pipe(fileStream);
res.body.on('error', reject);
fileStream.on('finish', resolve);
});
}
// 解凍
function unzipFile(zipFilePath, outputDir) {
const zip = new AdmZip(zipFilePath);
zip.extractAllTo(outputDir, true);
}
(async () => {
try {
await downloadFile(file_url, zipPath);
unzipFile(zipPath, outputPath);
fs.unlinkSync(zipPath);
} catch (error) {
process.exit(1);
}
})();
postinstallに登録してインストール時に自動的にスクリプトを走らせる。
fetchとadm-zipを使うためにインストールも仕込む。
package.json
"scripts": {
"postinstall": "npm i node-fetch & npm i adm-zip & node postscript.js"
}
気になる点
ライブラリをインストールしないといけないのが微妙ポイント。
zlibがビルトインなのでgzか生ファイルをダウンロードする方式なら何もインストールせずに完結できる。
でも、ファイルをいっぱいダウンロードしないといけないので一個ずつURL書くの面倒くさい。