From c27970a0a26f69e912cb574f8fa284295ddb6876 Mon Sep 17 00:00:00 2001 From: Gray Suitcase <41382894+PickledChair@users.noreply.github.com> Date: Sun, 12 Dec 2021 16:49:15 +0900 Subject: [PATCH] =?UTF-8?q?macOS=E7=94=A8=E3=82=A2=E3=83=97=E3=83=AA?= =?UTF-8?q?=E3=82=B1=E3=83=BC=E3=82=B7=E3=83=A7=E3=83=B3=E3=81=A8dmg?= =?UTF-8?q?=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB=E3=80=81zip=E3=83=95?= =?UTF-8?q?=E3=82=A1=E3=82=A4=E3=83=AB=E3=81=AE=E8=87=AA=E5=8B=95=E3=83=93?= =?UTF-8?q?=E3=83=AB=E3=83=89=20(#570)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add build steps for macOS to build-noengine-prepackage * run build.yml on every push (for test-build) * sedコマンドに与える正規表現を修正 * 大きいサイズのアイコンをmacOS向けに用意 512x512より小さいサイズのアイコンをmacOSビルドで使うと electron-builderがエラーを出力するため * fix artifact_path of macOS * add build steps for macOS to build-engine-prepackage * fix app.asar path of macOS * change each version of npm and electron-builder for macOS * npmのダウングレードのタイミングを変更 * npmとelectron-builderのバージョン変更をコメントアウト * clear cache for test * 実行権限を付与するファイルを追加 * make the distribution for macOS * fix quote * macos_executable_nameの設定し忘れを修正 * trivial change * dmgの名前にバージョン番号を追加 * キャッシュの設定をもとに戻す * build-engine-prepackageにおいてmacOS向けバイナリへの実行権限付与をしない Linux版と異なり、tar.gzファイルを配布しないため * run build.yml on main push * macOSにおいてBSD sedではなくGNU sedを使用 * vue.config.jsのmacOS向けの設定についてコメントを追加 * trivial change * Merge licenses.jsonのstepを全OSで共通化 * run build.yml on every push (for test) * add shell option setting for alias * aliasがうまく働かないのでsedのコマンド名の設定に変数を使う * trivial change * macOS向けにzipを作成 * mac向けzipの名前を変更 * macOS向けzipをReleasesのassetsにアップロード * fix comment * run build.yml on main push * fix comment --- .github/workflows/build.yml | 181 +++++++++++++++++++++++++++++++++--- public/icon-mac.png | Bin 0 -> 25514 bytes vue.config.js | 15 +++ 3 files changed, 185 insertions(+), 11 deletions(-) create mode 100644 public/icon-mac.png diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6f5e093b2a..2b07ccaead 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -28,6 +28,7 @@ jobs: - linux-noengine-cpu-prepackage - windows-noengine-prepackage - windows-noengine-cpu-prepackage + - macos-noengine-cpu-prepackage include: # Linux NVIDIA GPU - artifact_name: linux-noengine-prepackage @@ -35,6 +36,7 @@ jobs: package_name: voicevox linux_artifact_name: 'VOICEVOX.${ext}' linux_executable_name: voicevox + sed_name: sed os: ubuntu-18.04 # Linux CPU - artifact_name: linux-noengine-cpu-prepackage @@ -42,32 +44,70 @@ jobs: package_name: voicevox-cpu linux_artifact_name: 'VOICEVOX.${ext}' linux_executable_name: voicevox + sed_name: sed os: ubuntu-18.04 # Windows NVIDIA GPU - artifact_name: windows-noengine-prepackage artifact_path: dist_electron/win-unpacked package_name: voicevox nsis_web_artifact_name: 'VOICEVOX Web Setup ${version}.${ext}' + sed_name: sed os: windows-2019 # Windows CPU - artifact_name: windows-noengine-cpu-prepackage artifact_path: dist_electron/win-unpacked package_name: voicevox-cpu nsis_web_artifact_name: 'VOICEVOX-CPU Web Setup ${version}.${ext}' + sed_name: sed os: windows-2019 + # macOS CPU + - artifact_name: macos-noengine-cpu-prepackage + artifact_path: dist_electron/mac + package_name: voicevox-cpu + macos_artifact_name: 'VOICEVOX.${ext}' + sed_name: gsed + os: macos-11 runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@master + # NOTE: The default sed of macOS is BSD sed. + # There is a difference in specification between BSD sed and GNU sed, + # so you need to install GNU sed. + - name: Install GNU sed on macOS + if: startsWith(matrix.os, 'macos-') + shell: bash + run: | + brew install gnu-sed + # Rename executable file - name: Replace package name shell: bash run: | # GPU: "name": "voicevox" => "name": "voicevox" # CPU: "name": "voicevox" => "name": "voicevox-cpu" - sed -i 's/"name": "voicevox"/"name": "${{ matrix.package_name }}"/' package.json - # sed -i 's/productName: "VOICEVOX"/productName: "${{ matrix.product_name }}"/' vue.config.js + "${{ matrix.sed_name }}" -i 's/"name": "voicevox"/"name": "${{ matrix.package_name }}"/' package.json + # "${{ matrix.sed_name }}" -i 's/productName: "VOICEVOX"/productName: "${{ matrix.product_name }}"/' vue.config.js + + # NOTE: The extraFiles of electron-builder uses VOICEVOX.app/Contents/ as the file copy destination. + # However, since the executable file is located in VOICEVOX.app/Contents/MacOS/, + # it is inappropriate to copy the extraFiles to the VOICEVOX.app/Contents/ directory. + # Fix it so that it is copied to the VOICEVOX.app/Contents/MacOS/ directory. + # cf. https://k-hyoda.hatenablog.com/entry/2021/10/23/000349#%E8%BF%BD%E5%8A%A0%E5%B1%95%E9%96%8B%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%85%88%E3%81%AE%E8%A8%AD%E5%AE%9A + - name: Replace the extraFiles setting in vue.config.js for macOS + if: startsWith(matrix.os, 'macos-') + shell: bash + run: | + "${{ matrix.sed_name }}" -i 's/from: "build\/README.txt", to: "README.txt"/from: "build\/README.txt", to: "MacOS\/README.txt"/' vue.config.js + "${{ matrix.sed_name }}" -i 's/from: ".env.production", to: ".env"/from: ".env.production", to: "MacOS\/.env"/' vue.config.js + + # In order to replace two lines with sed, we need to replace LF with \n and treat it as one line. Finally, undo it. + # cf. https://deep.tacoskingdom.com/blog/15 + str_config=$(cat vue.config.js) + str_config_2=${str_config//$'\n'/\\n} + echo $str_config_2 | "${{ matrix.sed_name }}" -e 's/from: VOICEVOX_ENGINE_DIR,\\n[ ]*to: ""/from: VOICEVOX_ENGINE_DIR, to: "MacOS\/"/' -e s/'\\n'/\\$'\n'/g > vue.config.js + cat vue.config.js - name: Set output Node version id: node-version @@ -112,8 +152,8 @@ jobs: run: | df -h - - name: Overwrite .env.production for Linux - if: startsWith(matrix.os, 'ubuntu-') + - name: Overwrite .env.production for Linux and macOS + if: startsWith(matrix.os, 'ubuntu-') || startsWith(matrix.os, 'macos-') shell: bash run: | echo "ENGINE_PATH=./run" > .env.production @@ -186,6 +226,7 @@ jobs: NSIS_WEB_ARTIFACT_NAME: ${{ matrix.nsis_web_artifact_name }} LINUX_ARTIFACT_NAME: ${{ matrix.linux_artifact_name }} LINUX_EXECUTABLE_NAME: ${{ matrix.linux_executable_name }} + MACOS_ARTIFACT_NAME: ${{ matrix.macos_artifact_name }} run: npm run electron:build_pnever -- --dir - name: Upload NoEngine Prepackage @@ -215,6 +256,7 @@ jobs: - linux-cpu-prepackage - windows-nvidia-prepackage - windows-cpu-prepackage + - macos-cpu-prepackage include: # Linux NVIDIA GPU - artifact_name: linux-nvidia-prepackage @@ -222,20 +264,31 @@ jobs: voicevox_engine_asset_name: linux-nvidia linux_executable_name: voicevox targz_name: VOICEVOX + app_asar_dir: prepackage/resources # Linux CPU - artifact_name: linux-cpu-prepackage noengine_artifact_name: linux-noengine-cpu-prepackage voicevox_engine_asset_name: linux-cpu linux_executable_name: voicevox targz_name: VOICEVOX-CPU + app_asar_dir: prepackage/resources # Windows NVIDIA GPU - artifact_name: windows-nvidia-prepackage noengine_artifact_name: windows-noengine-prepackage voicevox_engine_asset_name: windows-nvidia + app_asar_dir: prepackage/resources # Windows CPU - artifact_name: windows-cpu-prepackage noengine_artifact_name: windows-noengine-cpu-prepackage voicevox_engine_asset_name: windows-cpu + app_asar_dir: prepackage/resources + # macOS CPU + - artifact_name: macos-cpu-prepackage + noengine_artifact_name: macos-noengine-cpu-prepackage + voicevox_engine_asset_name: macos-x64 + macos_executable_name: VOICEVOX + zip_name: voicevox-cpu-macos-x64 + app_asar_dir: prepackage/VOICEVOX.app/Contents/Resources runs-on: ${{ matrix.os }} steps: @@ -326,22 +379,30 @@ jobs: shell: bash run: | # Unpack asar - asar extract prepackage/resources/app.asar prepackage/resources/app - rm prepackage/resources/app.asar + asar extract "${{ matrix.app_asar_dir }}/app.asar" "${{ matrix.app_asar_dir }}/app" + rm "${{ matrix.app_asar_dir }}/app.asar" mv voicevox_engine/voicevox_engine/licenses.json engine_licenses.json - npm run license:merge -- -o prepackage/resources/app/licenses.json -i engine_licenses.json -i prepackage/resources/app/licenses.json + npm run license:merge -- -o "${{ matrix.app_asar_dir }}/app/licenses.json" -i engine_licenses.json -i "${{ matrix.app_asar_dir }}/app/licenses.json" # Repack asar - asar pack prepackage/resources/app prepackage/resources/app.asar - rm -rf prepackage/resources/app + asar pack "${{ matrix.app_asar_dir }}/app" "${{ matrix.app_asar_dir }}/app.asar" + rm -rf "${{ matrix.app_asar_dir }}/app" - name: Merge VOICEVOX ENGINE into prepackage/ + if: startsWith(matrix.artifact_name, 'windows-') || startsWith(matrix.artifact_name, 'linux-') shell: bash run: | mv voicevox_engine/voicevox_engine/* prepackage/ rm -rf voicevox_engine + - name: Merge VOICEVOX ENGINE into prepackage/VOICEVOX.app/Contents/MacOS/ + if: startsWith(matrix.artifact_name, 'macos-') + shell: bash + run: | + mv voicevox_engine/voicevox_engine/* prepackage/VOICEVOX.app/Contents/MacOS/ + rm -rf voicevox_engine + - name: Show disk space (debug info) shell: bash run: | @@ -361,6 +422,17 @@ jobs: chmod +x "prepackage/${{ matrix.linux_executable_name }}" chmod +x "prepackage/run" + - name: Recover file permissions for macOS build + if: startsWith(matrix.artifact_name, 'macos-') # macOS + shell: bash + run: | + chmod +x "prepackage/VOICEVOX.app/Contents/MacOS/${{ matrix.macos_executable_name }}" + chmod +x "prepackage/VOICEVOX.app/Contents/MacOS/run" + chmod +x "prepackage/VOICEVOX.app/Contents/Frameworks/VOICEVOX Helper (GPU).app/Contents/MacOS/VOICEVOX Helper (GPU)" + chmod +x "prepackage/VOICEVOX.app/Contents/Frameworks/VOICEVOX Helper (Plugin).app/Contents/MacOS/VOICEVOX Helper (Plugin)" + chmod +x "prepackage/VOICEVOX.app/Contents/Frameworks/VOICEVOX Helper (Renderer).app/Contents/MacOS/VOICEVOX Helper (Renderer)" + chmod +x "prepackage/VOICEVOX.app/Contents/Frameworks/VOICEVOX Helper.app/Contents/MacOS/VOICEVOX Helper" + - name: Set BUILD_IDENTIFIER env var if: startsWith(matrix.artifact_name, 'linux-') # linux shell: bash @@ -400,6 +472,20 @@ jobs: name: ${{ matrix.artifact_name }}-targz path: "${{ matrix.targz_name }}-${{ env.BUILD_IDENTIFIER }}.tar.gz" + - name: Create macOS zip + if: startsWith(matrix.artifact_name, 'macos-') + shell: bash + run: | + mv prepackage VOICEVOX + zip "${{ matrix.zip_name }}.zip" -r VOICEVOX + + - name: Upload macOS zip artifact + if: startsWith(matrix.artifact_name, 'macos-') + uses: actions/upload-artifact@v2 + with: + name: ${{ matrix.artifact_name }}-zip + path: "${{ matrix.zip_name }}.zip" + build-distributable: if: github.event.release.tag_name != '' # If release @@ -417,6 +503,7 @@ jobs: - linux-cpu-appimage - windows-nvidia-nsis-web - windows-cpu-nsis-web + - macos-cpu-dmg include: # Linux NVIDIA GPU - artifact_name: linux-nvidia-appimage @@ -424,6 +511,7 @@ jobs: package_name: voicevox linux_artifact_name: 'VOICEVOX.${ext}' linux_executable_name: voicevox + sed_name: sed os: ubuntu-18.04 # Linux CPU - artifact_name: linux-cpu-appimage @@ -431,24 +519,44 @@ jobs: package_name: voicevox-cpu linux_artifact_name: 'VOICEVOX.${ext}' linux_executable_name: voicevox + sed_name: sed os: ubuntu-18.04 # Windows NVIDIA GPU - artifact_name: windows-nvidia-nsis-web engine_artifact_name: windows-nvidia-prepackage package_name: voicevox nsis_web_artifact_name: 'VOICEVOX Web Setup ${version}.${ext}' + sed_name: sed os: windows-2019 # Windows CPU - artifact_name: windows-cpu-nsis-web engine_artifact_name: windows-cpu-prepackage package_name: voicevox-cpu nsis_web_artifact_name: 'VOICEVOX-CPU Web Setup ${version}.${ext}' + sed_name: sed os: windows-2019 + # macOS CPU + - artifact_name: macos-cpu-dmg + engine_artifact_name: macos-cpu-prepackage + package_name: voicevox-cpu + macos_artifact_name: 'VOICEVOX ${version}.${ext}' + macos_executable_name: VOICEVOX + sed_name: gsed + os: macos-11 runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@master + # NOTE: The default sed of macOS is BSD sed. + # There is a difference in specification between BSD sed and GNU sed, + # so you need to install GNU sed. + - name: Install GNU sed on macOS + if: startsWith(matrix.os, 'macos-') + shell: bash + run: | + brew install gnu-sed + # NOTE: If the CPU/GPU builds have the same package name, # the NSIS installers and the 7z files have duplicate names. # For Linux, If they have the same product name, @@ -460,8 +568,8 @@ jobs: run: | # GPU: "name": "voicevox" => "name": "voicevox" # CPU: "name": "voicevox" => "name": "voicevox-cpu" - sed -i 's/"name": "voicevox"/"name": "${{ matrix.package_name }}"/' package.json - # sed -i 's/productName: "VOICEVOX"/productName: "${{ matrix.product_name }}"/' vue.config.js + "${{ matrix.sed_name }}" -i 's/"name": "voicevox"/"name": "${{ matrix.package_name }}"/' package.json + # "${{ matrix.sed_name }}" -i 's/productName: "VOICEVOX"/productName: "${{ matrix.product_name }}"/' vue.config.js - name: Download and extract engine-prepackage artifact uses: actions/download-artifact@v2 @@ -476,6 +584,17 @@ jobs: chmod +x "prepackage/${{ matrix.linux_executable_name }}" chmod +x "prepackage/run" + - name: Recover file permissions for macOS build + if: endsWith(matrix.artifact_name, '-dmg') # macOS + shell: bash + run: | + chmod +x "prepackage/VOICEVOX.app/Contents/MacOS/${{ matrix.macos_executable_name }}" + chmod +x "prepackage/VOICEVOX.app/Contents/MacOS/run" + chmod +x "prepackage/VOICEVOX.app/Contents/Frameworks/VOICEVOX Helper (GPU).app/Contents/MacOS/VOICEVOX Helper (GPU)" + chmod +x "prepackage/VOICEVOX.app/Contents/Frameworks/VOICEVOX Helper (Plugin).app/Contents/MacOS/VOICEVOX Helper (Plugin)" + chmod +x "prepackage/VOICEVOX.app/Contents/Frameworks/VOICEVOX Helper (Renderer).app/Contents/MacOS/VOICEVOX Helper (Renderer)" + chmod +x "prepackage/VOICEVOX.app/Contents/Frameworks/VOICEVOX Helper.app/Contents/MacOS/VOICEVOX Helper" + - name: Show disk space (debug info) shell: bash run: | @@ -526,6 +645,7 @@ jobs: # NOTE: prepackage can be removed before splitting nsis-web archive - name: Build Electron + if: endsWith(matrix.artifact_name, '-nsis-web') || endsWith(matrix.artifact_name, '-appimage') # windows and linux shell: bash env: NSIS_WEB_ARTIFACT_NAME: ${{ matrix.nsis_web_artifact_name }} @@ -533,6 +653,13 @@ jobs: LINUX_EXECUTABLE_NAME: ${{ matrix.linux_executable_name }} run: npm run electron:build_pnever -- --prepackaged "prepackage/" + - name: Build Electron (for macOS) + if: endsWith(matrix.artifact_name, '-dmg') # macOS + shell: bash + env: + MACOS_ARTIFACT_NAME: ${{ matrix.macos_artifact_name }} + run: npm run electron:build_pnever -- --prepackaged "prepackage/VOICEVOX.app" + - name: Show disk space (debug info) shell: bash run: | @@ -546,6 +673,14 @@ jobs: path: | dist_electron/*.AppImage + - name: Upload macOS dmg artifact + if: endsWith(matrix.artifact_name, '-dmg') + uses: actions/upload-artifact@v2 + with: + name: ${{ matrix.artifact_name }} + path: | + dist_electron/*.dmg + - name: Create Windows NSIS Web artifact directory if: endsWith(matrix.artifact_name, '-nsis-web') shell: bash @@ -586,6 +721,8 @@ jobs: - linux-cpu-appimage - windows-nvidia-nsis-web - windows-cpu-nsis-web + - macos-cpu-dmg + - macos-cpu-prepackage-zip include: - artifact_name: linux-nvidia-appimage appimage_7z_name: VOICEVOX.AppImage @@ -593,6 +730,8 @@ jobs: appimage_7z_name: VOICEVOX-CPU.AppImage - artifact_name: windows-nvidia-nsis-web - artifact_name: windows-cpu-nsis-web + - artifact_name: macos-cpu-dmg + - artifact_name: macos-cpu-prepackage-zip runs-on: ${{ matrix.os }} steps: @@ -680,3 +819,23 @@ jobs: tag: ${{ github.ref }} # == github.event.release.tag_name file_glob: true file: artifact/*.exe + + # macOS dmg + - name: Upload macOS dmg to Release assets + if: endsWith(matrix.artifact_name, '-dmg') + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + tag: ${{ github.ref }} # == github.event.release.tag_name + file_glob: true + file: artifact/*.dmg + + # macOS zip + - name: Upload macOS zip to Release assets + if: startsWith(matrix.artifact_name, 'macos-') && endsWith(matrix.artifact_name, '-zip') + uses: svenstaro/upload-release-action@v2 + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + tag: ${{ github.ref }} # == github.event.release.tag_name + file_glob: true + file: artifact/*.zip diff --git a/public/icon-mac.png b/public/icon-mac.png new file mode 100644 index 0000000000000000000000000000000000000000..85b480b20a7231653b37d30b579c5af2126af92e GIT binary patch literal 25514 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 IdpxiF4;sG=V*mgE literal 0 HcmV?d00001 diff --git a/vue.config.js b/vue.config.js index f055828411..543c30d0db 100644 --- a/vue.config.js +++ b/vue.config.js @@ -15,6 +15,9 @@ const LINUX_ARTIFACT_NAME = process.env.LINUX_ARTIFACT_NAME; // ${packageName} const LINUX_EXECUTABLE_NAME = process.env.LINUX_EXECUTABLE_NAME; +// ${productName}-${version}.${ext} +const MACOS_ARTIFACT_NAME = process.env.MACOS_ARTIFACT_NAME; + module.exports = { configureWebpack: { devtool: "source-map", @@ -85,6 +88,18 @@ module.exports = { }, ], }, + mac: { + artifactName: + MACOS_ARTIFACT_NAME !== "" ? MACOS_ARTIFACT_NAME : undefined, + icon: "public/icon-mac.png", + category: "public.app-category.utilities", + target: [ + { + target: "dmg", + arch: ["x64"], + }, + ], + }, }, }, },