1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

npm publishで大きいファイルを扱う

Posted at

経緯

形態素解析の辞書ファイルをアップしたかったんだけど、ファイルが大きすぎて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

概要

  1. Github releaseで圧縮してアップロード
  2. ファイルダウンロード、解凍するpostscriptを作成
  3. 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書くの面倒くさい。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?