LoginSignup
6
1

More than 1 year has passed since last update.

OpenUPMにパッケージを公開する&リリースの自動化をする

Last updated at Posted at 2021-08-03

はじめに

この記事ではUnityのパッケージをOpenUPMに公開する方法を解説します。

こんな人におすすめです。

  • PackageManagerで自作パッケージを管理・公開したい
  • Assetsフォルダ下にパッケージが多すぎるから整理したい

公開手順

以下は実際に運用しているリポジトリなので、もし詰まったときは参考にしてみてください。

1. package.jsonを作成・記述

パッケージのルートフォルダにしたいフォルダにpackage.jsonファイルを作成・記述します。

例として、僕のパッケージのpackage.jsonを挙げます。

package.json
{
    "name": "com.mackysoft.vision",
    "displayName": "Vision",
    "version": "1.1.4",
    "unity": "2019.4",
    "description": "CullingGroup API for everyone.",
    "keywords": [ "Vision", "CullingGroup" ],
    "license": "MIT",
    "dependencies": {}
}

以下は特に重要な項目です。

項目 説明
name パッケージのアドレスになる(命名規則
version この値が更新されるとOpenUPMに新しいバージョンのパッケージが発行される。リリース時以外は手を出してはいけない。
unity パッケージの使用に必要なUnityの最小バージョン

2. Open UPMにパッケージを追加する

Package Addにアクセスし、OpenUPMにパッケージを追加する手続きを行います。

以下はOpenUPMにパッケージを追加する大まかな手順です。

  1. 自分のリポジトリのアドレスを入力してGoをクリックする。
  2. パッケージの情報を入力して、Verify packageをクリックする。
  3. OpenUPMのリポジトリをForkして、Pull Requestする。
  4. Pull Requestすると、OpenUPMが勝手に色々やってくれる。

この手順が完了すると、OpenUPMを介して自分のパッケージをインストールできるようになります。
さらにこのようなページが作成されます。

OpenUPMにパッケージを公開する手順は以上になります。

(おまけ)リリースの自動化

ここからはやらなくても構いませんが、やっておくと以下のことを自動で行えるようになります。

  • package.jsonのversionを更新
  • リポジトリにリリース(ドラフト)とタグを作成
  • unitypackageのエクスポートおよびアップロード

気になった方は、やってみるといいかもしれません。

1. unitypackageをエクスポートするスクリプトを記述する

GitHub Actions上でunitypackageをエクスポートするためのスクリプトを記述します。
(パッケージ名などは自身の物に合わせてください)

UnityPackageExporter.cs
using System.IO;
using System.Linq;
using UnityEngine;
using UnityEditor;

namespace MackySoft.Vision.Editor.PackageTools {

    /// <summary>
    /// It is used to create the Vision package. It is not used by the user.
    /// </summary>
    public static class UnityPackageExporter {

        // The name of the unitypackage to output.
        const string k_PackageName = "Vision";

        // The path to the package under the `Assets/` folder.
        const string k_PackagePath = "MackySoft";

        // Path to export to.
        const string k_ExportPath = "Build";

        const string k_SearchPattern = "*";
        const string k_PackageToolsFolderName = "PackageTools";

        public static void Export () {
            ExportPackage($"{k_ExportPath}/{k_PackageName}.unitypackage");
        }

        public static string ExportPackage (string exportPath) {
            // Ensure export path.
            var dir = new FileInfo(exportPath).Directory;
            if (dir != null && !dir.Exists) {
                dir.Create();
            }

            // Export
            AssetDatabase.ExportPackage(
                GetAssetPaths(),
                exportPath,
                ExportPackageOptions.Default
            );

            return Path.GetFullPath(exportPath);
        }

        public static string[] GetAssetPaths () {
            var path = Path.Combine(Application.dataPath,k_PackagePath);
            var assets = Directory.EnumerateFiles(path,k_SearchPattern,SearchOption.AllDirectories)
                .Where(x => !x.Contains(k_PackageToolsFolderName))
                .Select(x => "Assets" + x.Replace(Application.dataPath,"").Replace(@"\","/"))
                .ToArray();
            return assets;
        }

    }
}
  • Build/Vision.unitypackageを作成
  • パスにPackageToolsが含まれるファイルは除外

Scripting API: AssetDatabase.ExportPackage

2. release.yamlを記述する

GitHub Actions を利用し、パッケージを半自動でリリースするワークフローを記述します。
(パッケージ名などは自身の物に合わせてください)

package.json内のversionを書き換えることで、OpenUPMに新しいバージョンのパッケージが発行される仕組みになっています。

release.yaml
name: Release

on:
  workflow_dispatch:
    inputs:
      tag:
        description: "tag: git tag you want create. (sample 1.0.0)"
        required: true

env:
  GIT_TAG: ${{ github.event.inputs.tag }}

jobs:
  update-packagejson:
    runs-on: ubuntu-latest
    env:
      TARGET_FILE: ./Assets/MackySoft/MackySoft.Vision/package.json
    outputs:
      sha: ${{ steps.commit.outputs.sha }}
    steps:
      - uses: actions/checkout@v2
      - name: Output package.json (Before)
        run: cat ${{ env.TARGET_FILE}}

      - name: Update package.json to version ${{ env.GIT_TAG }}
        run: sed -i -e "s/\(\"version\":\) \"\(.*\)\",/\1 \"${{ env.GIT_TAG }}\",/" ${{ env.TARGET_FILE }}

      - name: Check update
        id: check_update
        run: |
          cat ${{ env.TARGET_FILE}}
          git diff --exit-code || echo "::set-output name=changed::1"
      - name: Commit files
        id: commit
        if: steps.check_update.outputs.changed == '1'
        run: |
          git config --local user.email "41898282+github-actions[bot]@users.noreply.github.com"
          git config --local user.name "github-actions[bot]"
          git commit -m "feat: Update package.json to ${{ env.GIT_TAG }}" -a
          echo "::set-output name=sha::$(git rev-parse HEAD)"
      - name: Check sha
        run: echo "SHA ${SHA}"
        env:
          SHA: ${{ steps.commit.outputs.sha }}

      - name: Create Tag
        if: steps.check_update.outputs.changed == '1'
        run: git tag ${{ env.GIT_TAG }}

      - name: Push changes
        if: steps.check_update.outputs.changed == '1'
        uses: ad-m/github-push-action@master
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          branch: ${{ github.ref }}
          tags: true

  build:
    needs: [update-packagejson]
    strategy:
      matrix:
        unity: ["2020.3.4f1"]
        include:
          - unityVersion: 2020.3.4f1
            license: UNITY_LICENSE
    runs-on: ubuntu-latest
    timeout-minutes: 15
    steps:
      - run: echo ${{ needs.update-packagejson.outputs.sha }}
      - uses: actions/checkout@v2
        with:
          ref: ${{ needs.update-packagejson.outputs.sha }}

      - name: Export unitypackage
        uses: game-ci/unity-builder@v2
        env:
          UNITY_LICENSE: ${{ secrets[matrix.license] }}
        with:
          projectPath: .
          unityVersion: ${{ matrix.unityVersion }}
          targetPlatform: StandaloneLinux64
          buildMethod: MackySoft.Vision.Editor.PackageTools.UnityPackageExporter.Export
          versioning: None

      - name: check all .meta is commited
        run: |
          if git ls-files --others --exclude-standard -t | grep --regexp='[.]meta$'; then
            echo "Detected .meta file generated. Do you forgot commit a .meta file?"
            exit 1
          else
            echo "Great, all .meta files are commited."
          fi
        working-directory: .

      # Store artifacts.
      - uses: actions/upload-artifact@v2
        with:
          name: Vision.unitypackage
          path: ./Build/Vision.unitypackage

  create-release:
    needs: [update-packagejson, build]
    runs-on: ubuntu-latest
    steps:
      # Create Releases
      - uses: actions/create-release@v1
        id: create_release
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tag_name: ${{ env.GIT_TAG }}
          release_name: ${{ env.GIT_TAG }}
          commitish: ${{ needs.update-packagejson.outputs.sha }}
          draft: true
          prerelease: false

      # Download(All) Artifacts to current directory
      - uses: actions/download-artifact@v2

      # Upload to Releases(unitypackage)
      - uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ steps.create_release.outputs.upload_url }}
          asset_path: ./Vision.unitypackage/Vision.unitypackage
          asset_name: Vision.unitypackage
          asset_content_type: application/octet-stream

3. リリースする

  1. リポジトリのActions > Release ワークフローに移動する。
  2. Run workflowドロップダウンをクリックする。
  3. tagにリリースするバージョンを入力する。(例:1.1.3
  4. Run workflowボタンをクリックする。

これで先ほど書いたrelease.yamlのワークフローが走り、

  • package.jsonのversionを更新
  • リポジトリにリリース(ドラフト)とタグを作成
  • unitypackageのエクスポートおよびアップロード

これらを自動で行ってくれます。

おわりに

この記事の方法で実際に運用しているリポジトリです。
分からないことがあった場合は参考にしてみてください。

参考

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1