目次

はじめに

Node.jsで、指定したnpmの情報が欲しいタイミングがあり、公開されているnpmのpackage.jsonを取得する方法を調べたらpackage-jsonというパッケージが簡単で良さそうだったので紹介します。

package-jsonとは

パッケージ名の通りpackage.jsonの情報を取得するためのパッケージで、レジストリに公開されているpackage.jsonを取得できます。パッケージバージョンの指定やプライベートレジストリでの使用なども可能なので、npm関連のメンテナンスツールを作る時に使えそうです。

(ただし、package-jsonのググラビリティが低いので、とにかく検索しにくい。)

インストール

package-jsonをnpmやyarnでインストール。

npm install package-json
# or yarn add package-json

公開されているnpmのpackage.jsonを取得してみる

試しにReactのpackage.jsonを取得してみます。

今回は、例としてindex.jsという名前で次のファイルを作成します。

// index.js
const packageJson = require('package-json')

packageJson('react').then((result) => {
  console.log(result)
})

ファイルを作成できたらターミナルでnode index.jsを実行して、先ほどのindex.jsを実行します。すると以下のようにversiondependenciesなどの、package.jsonの情報が取得できていることがわかります。

node index.js
{
  name: 'react',
  version: '16.13.1',
  dependencies: {
    'loose-envify': '^1.1.0',
    'object-assign': '^4.1.1',
    'prop-types': '^15.6.2'
  },
  dist: {
    integrity: '...',
    shasum: '...',
    tarball: 'https://registry.npmjs.org/react/-/react-16.13.1.tgz',
    fileCount: 10,
    unpackedSize: 203944,
    'npm-signature': '...'
  },
  engines: {
    node: '>=0.10.0'
  }
}

ただし、repositoryなど取得できていない項目があります。package-jsonはデフォルトでpackage.jsonの全ての情報を返すのではく、最低限の情報のみを返します。全ての項目が欲しい場合はfullMetadataオプションを使用してください。

const packageJson = require('package-json')

packageJson('react', {
  fullMetadata: true
}).then((result) => {
  console.log(result)
})

パッケージのバージョンを指定する

package-jsonはデフォルトでパッケージの最新版を参照しますが、versionバージョンを指定することもできます。例えば、TypeScriptの3.7の最新マイナーバージョンを取得したい場合は次のように指定できます。

packageJson('typescript', {
  version: '3.7'
}).then((result) => {
  console.log(result)
})

バージョンの詳しい指定方法は、こちらを参照してください。

プライベートレジストリで使う

人によっては会社のプライベートレジストリなどを使用している場合もあると思います。package-jsonはデフォルトで.npmrcregistryを参照するため、プライベートレジストリであっても.npmrcにレジストリの情報が記載されていればそのまま使用可能です。

.npmrcに設定されていないレジストリのpackage.jsonを取得したい場合は、registryUrlオプションを設定することで可能です。

packageJson('react', {
    registryUrl: 'https://my-registry-url.example.com'
}).then((result) => {
    console.log(result)
})

まとめ

  • そこまで出番は多くないけど、npm関連のメンテナンスツールとか作る時に便利そう。
  • バージョンの指定やプライベートレジストリでの使用もサポートされている。