Logo

    ©ゆとりちゃれんじ

    GitHubXInstagram
    GitHubでプライベートなnpmパッケージをMonorepoから公開してみた

    GitHubでプライベートなnpmパッケージをMonorepoから公開してみた

    はじめに

    ゆとり世代の中野です。

    さっそくチャレンジについて書いていきます。

    チャレンジする背景

    • 色々な選択肢を増やしたくて

    チャレンジ内容

    • githubのprivate repositoryのmonorepoを作成する
    • 作成したmonorepoで特定のディレクトリをpackage化する
    • package化したものを別のmonorepoのアプリケーションにインストールする
    • アプリケーション内でpublishしたpackageを利用する

    やったこと

    ‣
    monorepoの作成
    • pnpm dlx create-turbo@latest
    ‣
    packages/apiを作成
    ‣
    cd packages && pnpm create hono@latest を実行
    ‣
    packages/api/src/index.ts を修正しました
    ‣
    packages/api/src/hoge.ts を作成しました
    import { Hono } from "hono";
    
    const app = new Hono().get("/", (c) => {
      return c.json({
        message: "hoge",
      });
    });
    
    export default app;
    ‣
    設定ファイルを変更
    • packages/api/.npmrc にpublish時に必要な設定を追加
    • //npm.pkg.github.com/:_authToken=${NPM_TOKEN}
      @yutanakano:registry=https://npm.pkg.github.com
    • packages/api/package.json にpublish時に必要な設定を追加
    • packages/api/tsconfig.ts に設定を追加
    •   "compilerOptions": {
          ...
          "declaration": true,
          "outDir": "./dist",
        ...
    ‣
    githubでPAT(Personal Access Token)を作成
    • あとからわかるように名前をつけておきました
    • image
    ‣
    環境変数にPATを設定してpublish
    • localでpublishするためにtokenを設定します
    • export NPM_TOKEN=先ほど作成したPAT
    • publishコマンドを実行する
    • pnpm publish
    • 結果をgithubで確認する
    • image
    ‣
    別のアプリでpackageを利用
    • apps/web/.npmrc を作成します
    • //npm.pkg.github.com/:_authToken=${NPM_TOKEN}
      @yutanakano:registry=https://npm.pkg.github.com
    • appsに自動で作成されたwebで利用してみます
    • export NPM_TOKEN=先ほど作成したPAT
      pnpm add @yutanakano/api@0.0.0
    • packageを追加しました
    • pnpm add @yutanakano/api@0.0.0 hono
    • app/page.tsx を修正しました
    • 動作確認で http://localhost:3000 にAccessしてみると設定したmessageが確認できます
    • image

    結論

    • monorepo内も特定のディレクトリをpackage化することはできる
    • monorepo内の別のappの中でpackageを利用することもできる

    さいごに

    • packageの公開ステータスがRepositoryの設定とリンクしていました
      • Repositoryがprivateの場合はpackageもprivateでした
    • 試してみて引き出しを増やすことができた

    Reference

    GitHub Packages の npm レジストリを使って、社内 org 用のプライベートパッケージを公開する手順とインストールする手順

    複数のリポジトリで共有する node パッケージを、パブリックな npm レジストリではなく GitHub Packages の npm レジストリに公開して、 GitHub Organization 内でのみ利用可能なパッケージとして扱う手順を、社内共有用にまとめていきます。

    zenn.dev

    GitHub Packages の npm レジストリを使って、社内 org 用のプライベートパッケージを公開する手順とインストールする手順

    yutanakano

    WEBエンジニア

    大阪生まれのゆとり世代です

    趣味はバイクでツーリングに行くこと

    愛車は Ninja ZX-25R SE KRT EDITION

    Expoでプロダクトを作っています

    image
    Packages: +96
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    Progress: resolved 96, reused 95, downloaded 1, added 96, done
    ? Where would you like to create your Turborepo? mono
    ? Which package manager do you want to use? pnpm
    
    >>> Creating a new Turborepo with:
    
    Application packages
     - apps/docs
     - apps/web
    Library packages
     - packages/eslint-config
     - packages/typescript-config
     - packages/ui
    
    >>> Success! Created your Turborepo at mono
    
    To get started:
    - Change to the directory: cd mono
    - Enable Remote Caching (recommended): pnpm dlx turbo login
       - Learn more: https://turbo.build/repo/remote-cache
    
    - Run commands with Turborepo:
       - pnpm run build: Build all apps and packages
       - pnpm run dev: Develop all apps and packages
       - pnpm run lint: Lint all apps and packages
    - Run a command twice to hit cache
    pnpm create hono@latest
    .../1918cb4e015-12ef2                    |   +1 +
    .../1918cb4e015-12ef2                    | Progress: resolved 1, reused 1, downloaded 0, added 1, done
    create-hono version 0.12.0
    ? Target directory api
    ? Which template do you want to use? cloudflare-workers
    ✔ Cloning the template
    ? Do you want to install project dependencies? yes
    ? Which package manager do you want to use? pnpm
    ✔ Installing project dependencies
    🎉 Copied project files
    Get started with: cd api
    import { Hono } from "hono";
    import hoge from "./hoge";
    import { cors } from "hono/cors";
    
    const app = new Hono();
    
    app.use('/*', cors({
      origin: ['http://localhost:3000'], // フロントエンドのURLを指定
      allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
      allowHeaders: ['Content-Type', 'Authorization'],
      exposeHeaders: ['Content-Length'],
      maxAge: 600,
      credentials: true,
    }))
    
    const route = app.route("/hoge", hoge);
    
    export type AppType = typeof route;
    export default app;
      "name": "@yutanakano/api",
      "version": "0.0.0",
      "main": "dist/index.js",
      "types": "dist/index.d.ts",
      "repository": {
        "type": "git",
        "url": "https://github.com/yutanakano/mono.git",
        "directory": "packages/api"
      },
    
      "scripts": {
        ...
        "build": "tsc",
        ...
      },
      ...
    "use client";
    
    import type { AppType } from "@yutanakano/api";
    import { hc } from "hono/client";
    import { useEffect, useState } from "react";
    
    export default function RPC() {
      const client = hc<AppType>("http://localhost:8787");
      const [message, setMessage] = useState("hello world");
    
      const fetchGet = async () => {
        const res = await client.hoge.$get();
    
        if (res.ok) {
          const data = await res.json();
          setMessage(data.message);
        } else {
          setMessage("error");
        }
      };
    
      useEffect(() => {
        fetchGet();
      }, []);
    
      return <p>{message}</p>;
    }