🐼

【Nexus】Nexusでnpmのパッケージを管理する

に公開

Nexusとは

個人単位のフロントエンド開発におけるパッケージ管理では、package.jsonに依存関係を書いて、外部のnpmレジストリからnpm install等でパッケージを取得する等が一般的な方法かと思います。
企業などでは、Nexusなどのリポジトリ管理ツールを利用することも多いと思います。

Nexusを使うメリットは以下があります。

  • 依存関係の一貫性
    • 開発者同士で環境が統一される。
  • プライベートパッケージの管理
    • 組織のプライベート管理を外部に公開せずにNexus上で管理でき、他の外部パッケージと同じ場所で管理できる。
  • セキュリティの向上
    • Nexusのセキュリティ管理機能を使うと脆弱性のスキャンを実施でき、プロジェクトで管理しているパッケージのセキュリティリスクを検知できる。
  • キャッシュによるパッケージダウンロード速度の向上
    • npm install時のライブラリ取得先が、外部リポジトリではなくNexusになるため、通信速度の向上を期待できる。

Nexusのリポジトリの種類

  • Proxyリポジトリ
  • Hostedリポジトリ
    • 自分たちで作成したnpmパッケージを保存する。
  • Groupリポジトリ
    • 複数のリポジトリ(ProxyやHosted)を一つにまとめる。

package.jsonの用意

  • npmのパッケージを利用するpackge.jsonを用意します。
{
  "name": "nexus-example-project",
  "version": "1.0.0",
  "dependencies": {
    "lodash": "^4.17.21"
  }
}

Nexusの環境構築

  • ここでは、ホスティングしたいサーバー上で、dockerで動かすことを想定します。
  • docker-compose.ymlに以下のような定義をし、Nexusサーバーを作成します。
services:
  nexus:
    image: sonatype/nexus3:latest
    container_name: nexus
    restart: always
    ports:
      - "8082:8081"
    volumes:
      - ./nexus-data:/nexus-data

Nexusでリポジトリの作成

  • Adminアカウントでログインし、「設定」 > 「Repositories」 > 「Create repository」を選択します。

  • npm(proxy)を選択し、設定を入力し、Create repositoryをします。必須項目はName(Nexus上での識別子)とRemote registory(例:https://registry.npmjs.org)です。

  • npm(group)を選択します。Member repositoriesで、一つ前で作成した"npm-proxy"を加えたらCreate repositoryをします。

  • Brawseタブにいくと、追加したnpm(proxy)とnpm(groug)が作成されています。

パッケージの取得先をNexusに変更し、npm install実行

Nexusでリポジトリを作成しましたが、どうすればローカルでnpm installをしたとき取得先がNexusになるでしょうか?

ローカルでのnpmレジストリの向き先は、以下のコマンドで確認することができます。

$ npm get registry

https://registry.npmjs.org/

これを、先ほど作成したNexusのパッケージに変更します。

$ npm set registry http://localhost:8082/repository/npm-group/

その状態でnpm installを実行すると、package.jsonが作成されました。

{
  "name": "nexus-example-project",
  "version": "1.0.0",
  "lockfileVersion": 2,
  "requires": true,
  "packages": {
    "": {
      "name": "nexus-example-project",
      "version": "1.0.0",
      "dependencies": {
        "lodash": "^4.17.21"
      }
    },
    "node_modules/lodash": {
      "version": "4.17.21",
      "resolved": "http://localhost:8082/repository/npm-group/lodash/-/lodash-4.17.21.tgz",
      "integrity": "sha512-v2kDE3QVlnxzowRzzkK+/W+8xFXthFvSDk+0axZlgz+E46kL3L9VYZP9cxlVOa6b7LfGxkEnGwvHc55XTOwZKw==",
      "dev": false
    }
  },
  "dependencies": {
    "lodash": {
      "version": "4.17.21",
      "resolved": "http://localhost:8082/repository/npm-group/lodash/-/lodash-4.17.21.tgz",
      "integrity": "sha512-v2kDE3QVlnxzowRzzkK+/W+8xFXthFvSDk+0axZlgz+E46kL3L9VYZP9cxlVOa6b7LfGxkEnGwvHc55XTOwZKw=="
    }
  }
}

resolvedというのが、パッケージの取得先を表しています。
このpackage-lock.jsonをプロジェクトで管理することで、他の人も同じバージョンのパッケージをNexusから取得するようになります。

さらに、Nexus上では先ほどまで空だったnpm-proxyにパッケージがキャッシュされていることが確認できました。

Discussion