NPMクリーンモジュール


144

npmにnode_modulesの下のすべてのモジュールをアンビルドさせる方法はありますか?すべてのビルドアーティファクトを削除するがそれらを再ビルドしないnpm rebuildのようなものですか?


4
あなたに聞かれるとは思わなかった。で推奨されているように私はgitのに私のnode_modulesディレクトリをチェックしてきましたmikealrogers.com/posts/nodemodules-in-git.html。新しいモジュールを追加したり、現在のモジュールを更新したりすると、gitに存在してはならないビルドアーティファクトができてしまい、クリーンアップする必要があります。最初にそれらをきれいにできるかどうか、プロセスがもう少しスムーズに進むかと考えていました。
デイブ・コージー

1
簡単なメモ:NPMがサポートするようになったためshrinkwrapnpmjs.org/doc/shrinkwrap.htmlを参照)、依存関係のすべてのバージョンをロックできます(最上位のものだけでなく)。
ミシェルティリー

2
この機能がないと、クロスプラットフォームの開発にも不向きです。Macで開発し、CIをLinuxで実行します。Linuxでビルドを行うたびにnode_modulesディレクトリを削除して完全に再インストールする必要があるため、膨大な時間を浪費します。
JBCP 2014

4
@JBCPあなたはそれを間違っています。あなたがしなければならないことは、packages.json(を使用してnpm --save)にモジュールをインストールし、(gitを使用している場合)にnode_modulesディレクトリを配置することです。CIはnode_modulesをプルするのではなく、を実行する必要があります。最後に、npmレジストリからのダウンロードに時間がかかりすぎる場合は、sinopiaなどを使用してキャッシュします。.gitignorenpm install
Bojan Markovic 2015

1
@BojanMarkovic-あなたは正しい、これが私たちのプロジェクトが現在セットアップされている方法です。上記の私のコメントは、約1年前からのものでした。node_modulesをGitにコミットすることを推奨するいくつかのプロジェクトが(ありました)ありますが、それは間違いなく正しくありません。
JBCP 2015

回答:


160

あなたはnode_moduleディレクトリを削除することができます

rm -rf node_modules/

14
これは、node_modulesのソースとコンパイルされた出力を削除するため、質問には答えません。
theGecko

npmリンクでリンクされた依存関係がある場合、ソースディレクトリ内のこれらのモジュールソースを削除することもできます。これは非常に苦痛になる可能性があります...
cschuff

12
私は自分にこれを追加しましたpackage.json"clean": "rm -rf node_modules", "reinstall": "npm run clean && npm install", "rebuild": "npm run clean && npm install && npm run build",。うまくいくようです。
Lucas

5
Windowsの場合> rd node_modules / s
Samantha

2
@Lucasこれは最も適切な回答なので、回答を投稿する必要があります
ジョセフ

57

これを自分のpackage.jsonに追加しました:

"build": "npm build",
"clean": "rm -rf node_modules", 
"reinstall": "npm run clean && npm install", 
"rebuild": "npm run clean && npm install && npm run build",

うまくいくようです。


2
cleanpackage.jsonで定義する必要があります!
Ciasto piekarz 2018

20
@Ciastopiekarz?それが私の答えが上に言っていることですか?
ルーカス

Linuxベースのマシンの場合は「rm -rf node_modules」、Windowsの場合は「rmdir / s / q node_modules」を使用
Mohamed.Abdo

8

パッケージtarballをダウンロードしてnpmキャッシュディレクトリにアンパックする 'npm cache'コマンドを利用できます。

その後、ソースをコピーできます。

https://groups.google.com/forum/?fromgroups=#!topic/npm-/mwLuZZkHkfUから収集したアイデアを使用して、次のノードスクリプトを思いつきました。保証、YMMVなどはありません。

var fs = require('fs'),
path = require('path'),
exec = require('child_process').exec,
util = require('util');

var packageFileName = 'package.json';
var modulesDirName = 'node_modules';
var cacheDirectory = process.cwd();
var npmCacheAddMask = 'npm cache add %s@%s; echo %s';
var sourceDirMask = '%s/%s/%s/package';
var targetDirMask = '%s/node_modules/%s';

function deleteFolder(folder) {
    if (fs.existsSync(folder)) {
        var files = fs.readdirSync(folder);
        files.forEach(function(file) {
            file = folder + "/" + file;
            if (fs.lstatSync(file).isDirectory()) {
                deleteFolder(file);
            } else {
                fs.unlinkSync(file);
            }
        });
        fs.rmdirSync(folder);
    }
}

function downloadSource(folder) {
    var packageFile = path.join(folder, packageFileName);
    if (fs.existsSync(packageFile)) {
        var data = fs.readFileSync(packageFile);
        var package = JSON.parse(data);

        function getVersion(data) {
            var version = data.match(/-([^-]+)\.tgz/);
            return version[1];
        }

        var callback = function(error, stdout, stderr) {
            var dependency = stdout.trim();
            var version = getVersion(stderr);
            var sourceDir = util.format(sourceDirMask, cacheDirectory, dependency, version);
            var targetDir = util.format(targetDirMask, folder, dependency);
            var modulesDir = folder + '/' + modulesDirName;

            if (!fs.existsSync(modulesDir)) {
                fs.mkdirSync(modulesDir);
            }

            fs.renameSync(sourceDir, targetDir);
            deleteFolder(cacheDirectory + '/' + dependency);
            downloadSource(targetDir);
        };

        for (dependency in package.dependencies) {
            var version = package.dependencies[dependency];
            exec(util.format(npmCacheAddMask, dependency, version, dependency), callback);
        }
    }
}

if (!fs.existsSync(path.join(process.cwd(), packageFileName))) {
    console.log(util.format("Unable to find file '%s'.", packageFileName));
    process.exit();
}

deleteFolder(path.join(process.cwd(), modulesDirName));
process.env.npm_config_cache = cacheDirectory;
downloadSource(process.cwd());

12
npmで実際に推奨されているこのような基本的な機能を実現するにはハックが必要なのは非常に奇妙です。他のみんなは何をしますか?推奨事項を無視して使用しnpm installますか?
VitalyB 14

5

一言でいえば

二人では、まだ

ただし、ビルドせずにインストールを実行するための--no-buildフラグには未解決の問題があり、これは、npm installあなたが求めていることを行うために使用される可能性があります。

この未解決の問題を参照してください。




3

package.json内に数行追加しました:

"scripts": {
  ...
  "clean": "rmdir /s /q node_modules",
  "reinstall": "npm run clean && npm install",
  "rebuild": "npm run clean && npm install && rmdir /s /q dist && npm run build --prod",
  ...
}

あなたcleanだけがしたいなら、これを使うことができますrimraf node_modules


0

このジョブには実際には特別なコマンドがあります

npm ci

node_modulesディレクトリを削除し、package-lock.jsonファイルに関してパッケージをインストールします

詳細:https : //docs.npmjs.com/cli/ci.html

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.