programing

개발자 ID인 macOS Installer 패키지 준비

batch 2023. 5. 6. 14:12
반응형

개발자 ID인 macOS Installer 패키지 준비

참고: 이는 OS X Installer 패키지 전용이며, Mac App Store에 제출하기 위한 패키지는 다른 규칙을 따릅니다.

마운틴 라이온의 문지기 때문에 저는 마침내 헛간 뒤에 있는 제 PackageMaker 빌드 스크립트를 가져와 촬영해야 했습니다.PackageMaker는 이미 Xcode에서 제거되어 "Xcode용 보조 도구"로 이동되었으므로 곧 잊혀지기를 바랍니다.

문제는 어떻게 사용하느냐입니다.pkgbuild,productbuild,그리고.pkgutil대체하기 위해?

이 예제 프로젝트에는 두 가지 빌드 대상이 있습니다.HelloWorld.app과 Helper.app.우리는 각각의 구성요소 패키지를 만들어 제품 아카이브로 결합합니다.

구성 요소 패키지에는 OS X Installer에서 설치할 페이로드가 포함되어 있습니다.구성 요소 패키지는 자체적으로 설치할 수 있지만 일반적으로 제품 아카이브에 통합됩니다.

우리의 도구: pkgbuild, productbuild, pkgutil

빌드 및 보관이 성공적으로 완료되면 터미널에서 $BUILT_PRODUCTS_DIR을 엽니다.

$ cd ~/Library/Developer/Xcode/DerivedData/.../InstallationBuildProductsLocation
$ pkgbuild --analyze --root ./HelloWorld.app HelloWorldAppComponents.plist
$ pkgbuild --analyze --root ./Helper.app HelperAppComponents.plist

구성요소 목록이 제공되고 "구성요소 속성 목록" 섹션에서 값 설명을 찾을 수 있습니다.pkgbuild -root는 구성 요소 패키지를 생성합니다. 기본 속성을 변경할 필요가 없는 경우 다음 명령에서 --component-plist 매개 변수를 생략할 수 있습니다.

productbuild -- 배포 정의의 결과를 합성합니다.

$ pkgbuild --root ./HelloWorld.app \
    --component-plist HelloWorldAppComponents.plist \
    HelloWorld.pkg
$ pkgbuild --root ./Helper.app \
    --component-plist HelperAppComponents.plist \
    Helper.pkg
$ productbuild --synthesize \
    --package HelloWorld.pkg --package Helper.pkg \
    Distribution.xml 

배포에서.xml 제목, 배경, 시작, 읽기, 라이센스 등을 변경할 수 있습니다.다음 명령을 사용하여 구성 요소 패키지 및 배포 정의를 제품 아카이브로 전환합니다.

$ productbuild --distribution ./Distribution.xml \
    --package-path . \
    ./Installer.pkg

iTunes InstallersDistribution.xml을 통해 무엇이 가능한지 확인하는 것이 좋습니다.다음을 사용하여 "Install iTunes.pkg"을 추출할 수 있습니다.

$ pkgutil --expand "Install iTunes.pkg" "Install iTunes"

합치자

보통 프로젝트에 패키지라는 폴더가 있는데 여기에는 Distribution.xml, 구성 요소 목록, 리소스 및 스크립트가 포함됩니다.

다음을 설치할 때만 스크립트 실행으로 설정된 "패키지 생성"이라는 스크립트 빌드 실행 단계를 추가합니다.

VERSION=$(defaults read "${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}/Contents/Info" CFBundleVersion)

PACKAGE_NAME=`echo "$PRODUCT_NAME" | sed "s/ /_/g"`
TMP1_ARCHIVE="${BUILT_PRODUCTS_DIR}/$PACKAGE_NAME-tmp1.pkg"
TMP2_ARCHIVE="${BUILT_PRODUCTS_DIR}/$PACKAGE_NAME-tmp2"
TMP3_ARCHIVE="${BUILT_PRODUCTS_DIR}/$PACKAGE_NAME-tmp3.pkg"
ARCHIVE_FILENAME="${BUILT_PRODUCTS_DIR}/${PACKAGE_NAME}.pkg"

pkgbuild --root "${INSTALL_ROOT}" \
    --component-plist "./Package/HelloWorldAppComponents.plist" \
    --scripts "./Package/Scripts" \
    --identifier "com.test.pkg.HelloWorld" \
    --version "$VERSION" \
    --install-location "/" \
    "${BUILT_PRODUCTS_DIR}/HelloWorld.pkg"
pkgbuild --root "${BUILT_PRODUCTS_DIR}/Helper.app" \
    --component-plist "./Package/HelperAppComponents.plist" \
    --identifier "com.test.pkg.Helper" \
    --version "$VERSION" \
    --install-location "/" \
    "${BUILT_PRODUCTS_DIR}/Helper.pkg"
productbuild --distribution "./Package/Distribution.xml"  \
    --package-path "${BUILT_PRODUCTS_DIR}" \
    --resources "./Package/Resources" \
    "${TMP1_ARCHIVE}"

pkgutil --expand "${TMP1_ARCHIVE}" "${TMP2_ARCHIVE}"
    
# Patches and Workarounds

pkgutil --flatten "${TMP2_ARCHIVE}" "${TMP3_ARCHIVE}"

productsign --sign "Developer ID Installer: John Doe" \
    "${TMP3_ARCHIVE}" "${ARCHIVE_FILENAME}"

제품 빌드로 생성된 후 패키지를 변경할 필요가 없다면 패키지를 제거할 수 있습니다.pkgutil --expand그리고.pkgutil --flatten단계. 또한 제품 서명을 실행하는 대신 제품 빌드에서 --sign parameter를 사용할 수 있습니다.

OS X 설치 관리자 서명

패키지는 Developer Certificate Utility에서 다운로드할 수 있는 Developer ID Installer 인증서로 서명됩니다.

은 그은서끝났다니습이명들▁▁the다▁로 서명을 합니다.--sign "Developer ID Installer: John Doe"pkg build, product build 또는 product sign의 매개 변수.

productbuild를 사용하여 서명된 제품 보관 파일을 생성하려는 경우 구성 요소 패키지에 서명할 이유가 없습니다.

개발자 인증서 유틸리티

끝까지:Xcode 아카이브에 패키지 복사

Xcode Archive에 무언가를 복사하려면 스크립트 빌드 실행 단계를 사용할 수 없습니다.이를 위해 계획 작업을 사용해야 합니다.

구성표를 편집하고 보관을 확장합니다.그런 다음 사후 액션을 클릭하고 새 스크립트 실행 액션을 추가합니다.

Xcode 6에서:

#!/bin/bash

PACKAGES="${ARCHIVE_PATH}/Packages"
  
PACKAGE_NAME=`echo "$PRODUCT_NAME" | sed "s/ /_/g"`
ARCHIVE_FILENAME="$PACKAGE_NAME.pkg"
PKG="${OBJROOT}/../BuildProductsPath/${CONFIGURATION}/${ARCHIVE_FILENAME}"

if [ -f "${PKG}" ]; then
    mkdir "${PACKAGES}"
    cp -r "${PKG}" "${PACKAGES}"
fi

5에서는 Xcode 5의 경우 이 을 사용합니다.PKG대신:

PKG="${OBJROOT}/ArchiveIntermediates/${TARGET_NAME}/BuildProductsPath/${CONFIGURATION}/${ARCHIVE_FILENAME}"

당신의 버전 컨트롤이 Xcode Scheme 정보를 저장하지 않을 경우, 나는 당신의 프로젝트에 셸 스크립트로 추가하여 당신이 작업 공간에서 작업 후로 스크립트를 드래그하여 간단하게 작업을 복원할 수 있도록 하는 것을 제안합니다.

스크립팅

배포 정의 파일의 JavaScript와 셸 스크립트라는 두 가지 종류의 스크립트가 있습니다.

WhiteBox - PackageMaker How-to에서 찾은 Shell Scripts에 대한 최고의 문서이지만 이전 패키지 형식을 참조하므로 주의하여 읽어보십시오.

애플 실리콘

에서 arm64로 .hostArchitectures하는 는섹션되를 지원하는 arm64x86_64:

<options hostArchitectures="arm64,x86_64" />

추가 판독치

알려진 문제 및 해결 방법

대상 선택 창

사용자에게 대상 선택 옵션이 표시되고 "이 컴퓨터의 모든 사용자에 대해 설치"를 선택할 수 있습니다.옵션이 시각적으로 선택된 것처럼 보이지만 설치를 계속하려면 옵션을 클릭해야 하므로 혼란이 발생합니다.

설치 프로그램 버그 표시 예제

Documentation은 Apple Documentation을 사용할 합니다.<domains enable_anywhere ... />그러나 이것은 Apple이 패키지에서 사용하지 않는 새로운 버그가 많은 대상 선택 창을 트리거합니다.

하지 않는 용하지않을 합니다.<options rootVolumeOnly="true" />이전 대상 선택 창이 나타납니다. 이전 대상 선택 창 표시 예제


현재 사용자의 홈 폴더에 항목을 설치하려고 합니다.

단답: 시도하지 마세요!

긴 답변: 정말이지; 시도하지 마십시오! 설치 프로그램 문제해결 방법을 읽어 보십시오.제가 이걸 읽고도 뭘 했는지 아세요?저는 그것을 시도할 만큼 멍청했습니다.10.7 또는 10.8에서 문제를 해결했다고 스스로에게 말합니다.

우선 위에서 언급한 Destination Select Pane Bug를 간간이 보았습니다.그것이 저를 멈추게 했어야 했지만, 저는 그것을 무시했습니다.소프트웨어를 릴리스한 후 일주일을 보내고 싶지 않은 경우에는 파란색 항목을 선택한 후 클릭해야 한다는 지원 이메일에 응답하지 마십시오.

당신은 이제 당신의 사용자들이 패널을 이해할 만큼 충분히 똑똑하다고 생각하고 있습니다, 그렇지 않나요?홈 폴더 설치와 관련된 또 다른 점은 작동하지 않는다는 것입니다!

저는 OS 버전이 다른 약 10개의 다른 컴퓨터에서 2주 동안 테스트를 했지만 실패하지 않았습니다.그래서 발송했습니다.출시 한 시간 만에 설치할 수 없었던 사용자들의 의견을 들을 수 있었습니다.로그가 수정할 수 없는 사용 권한 문제를 암시했습니다.

다시 한 번 말씀드리겠습니다.홈 폴더 설치에는 Installer를 사용하지 않습니다!


환영, 리드미, 라이센스 및 결론에 대한 RTFD는 다음 사람에 의해 수락되지 않습니다.productbuild.

설치 프로그램은 RTFD 파일을 시작할 때부터 이미지가 포함된 예쁜 시작 화면을 만들 수 있도록 지원했지만 제품 빌드에서는 이를 허용하지 않습니다.

해결 방법:더미 rtf 파일을 사용하고 패키지에서 다음 시간까지 교체합니다.productbuild완료되었습니다.

참고: RTFD 파일 안에 Retina 영상을 넣을 수도 있습니다.다중 이미지 tiff 파일 사용:tiffutil -cat Welcome.tif Welcome_2x.tif -out FinalWelcome.tif자세한 내용.


BundlePostInstallScriptPath 스크립트를 사용하여 설치가 완료될 때 애플리케이션 시작:

#!/bin/bash

LOGGED_IN_USER_ID=`id -u "${USER}"`

if [ "${COMMAND_LINE_INSTALL}" = "" ]
then
    /bin/launchctl asuser "${LOGGED_IN_USER_ID}" /usr/bin/open -g PATH_OR_BUNDLE_ID
fi

exit 0

앱을 설치 관리자 사용자가 아닌 로그인한 사용자로 실행하는 것이 중요합니다.이 작업은 launchctl asuser uid 경로로 수행됩니다.또한 설치 도구나 Apple 원격 데스크톱을 사용하여 명령줄 설치가 아닌 경우에만 실행합니다.


Stephane Sudre의 매우 흥미로운 응용 프로그램이 있습니다. 이 모든 것을 해주고, 스크립트가 가능하며, 명령줄에서 빌드를 지원하고, 매우 멋진 GUI를 가지고 있으며, 무료입니다.슬픈 것은: 구글에서 찾을 수 없게 만드는 "패키지"라고 불리는 것입니다.

http://s.sudre.free.fr/Software/Packages/about.html

저는 제가 직접 대본을 만들기 전에 그것에 대해 알았더라면 좋았을 것입니다.

패키지 응용 프로그램 스크린샷

참고로 번들이나 플러그인에 대한 패키지 설치 프로그램을 만들려고 하는 사람들에게는 쉽습니다.

pkgbuild --component "Color Lists.colorPicker" --install-location ~/Library/ColorPickers ColorLists.pkg

A +1에서 수락된 답변:

설치 관리자에서 대상 선택

에서 도메인을 선택하는 것을 에는 시도하는 보다 사용자 도메인과 시스템 도메인을 선택합니다.<domains enable_anywhere="true">다음을 사용합니다.

<domains enable_currentUserHome="true" enable_localSystem="true"/>

enable_currentUserHome은 애플리케이션 앱을 아래에 설치합니다.~/Applications/그리고.enable_localSystem에서는 응용 을 용응프을설수있습다니치할위다치음에에 할 수 ./Application

El Capitan 10.11.6(15G1217)에서 사용해 본 결과, 1개의 개발 시스템과 2개의 다른 VM에서 완벽하게 작동하는 것으로 나타났습니다.

다음은 빌드 루트에서 서명된 설치 프로그램 패키지를 생성하는 빌드 스크립트입니다.

#!/bin/bash
# TRIMCheck build script
# Copyright Doug Richardson 2015
# Usage: build.sh
#
# The result is a disk image that contains the TRIMCheck installer.
#

DSTROOT=/tmp/trimcheck.dst
SRCROOT=/tmp/trimcheck.src

INSTALLER_PATH=/tmp/trimcheck
INSTALLER_PKG="TRIMCheck.pkg"
INSTALLER="$INSTALLER_PATH/$INSTALLER_PKG"

#
# Clean out anything that doesn't belong.
#
echo Going to clean out build directories
rm -rf build $DSTROOT $SRCROOT $INSTALLER_PATH
echo Build directories cleaned out


#
# Build
#
echo ------------------
echo Installing Sources
echo ------------------
xcodebuild -project TRIMCheck.xcodeproj installsrc SRCROOT=$SRCROOT || exit 1

echo ----------------
echo Building Project
echo ----------------
pushd $SRCROOT
xcodebuild -project TRIMCheck.xcodeproj -target trimcheck -configuration Release install || exit 1
popd

echo ------------------
echo Building Installer
echo ------------------
mkdir -p "$INSTALLER_PATH" || exit 1

echo "Runing pkgbuild. Note you must be connected to Internet for this to work as it"
echo "has to contact a time server in order to generate a trusted timestamp. See"
echo "man pkgbuild for more info under SIGNED PACKAGES."
pkgbuild --identifier "com.delicioussafari.TRIMCheck" \
    --sign "Developer ID Installer: Douglas Richardson (4L84QT8KA9)" \
    --root "$DSTROOT" \
    "$INSTALLER" || exit 1


echo Successfully built TRIMCheck
open "$INSTALLER_PATH"

exit 0

언급URL : https://stackoverflow.com/questions/11487596/making-macos-installer-packages-which-are-developer-id-ready

반응형