web-dev-qa-db-ja.com

package.jsonで「ファイル」および「ディレクトリ」プロパティをどのように使用しますか?

もし package.jsonにはfilesプロップ、および/またはdirectoriesプロップがあります。

  "files": [
    "./src/assets/fonts/"
  ],
  "directories": {
     "assets:": "./src/assets"
  }

それらを利用する方法は何ですか?ドキュメントには、それらが指定された後に何ができるかは記載されていません。

たとえば、 files docs say:

「ファイル」フィールドは、プロジェクトに含めるファイルの配列です。配列内のフォルダーに名前を付けると、そのフォルダー内のファイルも含まれます。

「プロジェクトに含める」とはどういう意味ですか?どこに含めますか?以前はなかったのに、どのようにアクセス可能になりましたか?

ディレクトリセクション で、ドキュメントは次のように述べています。

将来、この情報はother創造的な方法で使用される可能性があります。

それが使用されている既存の創造的な方法は何ですか?

55
Baz

「プロジェクトに含める」とは、npm publishの実行時に作成されるパッケージ化されたtarballにファイルが含まれることを意味します。 npm packを実行して、実際に公開をトリガーせずに検査用のtarballを生成することもできます。この方法で、生成されたtarballを実際に開き、どのファイルが含まれていたか/含まれていなかったかを調べることができます。

.npmignore(または.gitignoreがプロキシとして、.npmignoreがない場合)は無視するファイルのブラックリストとして機能します(したがって、デフォルトで他のすべてを含みます)、files配列はホワイトリストです。つまり、デフォルトですべてを含めるのではなく、files配列を指定すると、すべてがデフォルトで除外され、明示的にリストされたファイルのみがパッケージ化されたtarballに含まれます。

例として、パッケージがブラウザでの使用を目的としたライブラリであるとします。コードはlib/にあり、browserifyを実行してdist/index.jsでブラウザー互換のライブラリにコンパイルします。 .gitignoreにリストされているファイルの束から始めます。これは、存在しないデファクト.npmignoreとして使用されます。しかし、dist/には生成されたファイルがいっぱいになったので、それらをgitリポジトリから無視する必要があります。それらを.gitignoreに追加すると、gitリポジトリから除外されますただし、パッケージtarballからも無視されます。したがって、2つのオプションがあります。.gitignore.npmignoreとして複製しますが、dist/には.gitignoreのみをリストします。これを行う場合、2つのファイルをほぼ同期させる必要があります。この方法は退屈でエラーが発生しやすいです。

もう1つの方法は、.npmignoreを持たず、代わりにパッケージで実際に必要なファイルをfiles配列にリストするだけです。 README.*package.jsonCHANGELOG.*(他にもいくつかあります)は、関係なくtarballに自動的に含まれます。したがって、"files": [ "dist" ]を追加するだけで完了です。これで、パッケージtarballにはlibからの元のソースJSもtests/なども含まれず、代わりにdist/に実際にコンパイルされたlibのみが含まれます。

directoriesに関しては、通常lib(es5の場合)、src(es6、coffeescript、TypeScriptなどのソースの場合)、dist(ブラウザーの場合)またはvm固有のビルド)、testoutput(カバレッジレポートなどの一時的に生成されたファイル用)、docなど。このプロパティは直接使用されませんがnpmまたは他のツール、それはディレクトリ構造を明示的にします。また、次のようにnpmスクリプトでディレクトリを参照可能にします。

"scripts": {
  "clean": "rm -rf $npm_package_directories_dist $npm_package_directories_output",
  "lint": "eslint $npm_package_directories_src",
  "test": "teenytest $npm_package_directories_test",
}

この方法では、ディレクトリは一度だけ指定され、変更する場合は、単一の場所で変更するだけで済みます(package.json全体ではなく)。

72
jasonkarns