Pytanie Portowanie wiersza poleceń PackageMaker buduje instalator na pkgbuild


Próbowałem przesłać komputer Mac PackageMaker kompilacja linii poleceń do pkgbuild i productbuild, ale utknąłem. Niestety nie znalazłem wiele z niczego dokumentujących działanie tych nowych programów poza tym StackOverflow post i pkgbuild i productbuild strony man.

Oto mój problem. Utworzyłem główny katalog instalacyjny z następującymi plikami:

/some_path/Applications
                       /MyProgram.app
          /Library
                  /Frameworks
                             /MyFramework.framework
                                                   /[library files...]

Wywołanie wiersza poleceń działało doskonale dla pakietu PackageMaker. Stworzył instalator, który zainstalował wszystkie powyższe pliki.

$ /Developer/usr/bin/packagemaker \
    --title "My Program" \
    --root /some_path \
    --version 1.0.0 \
    --filter "\.DS_Store" \
    --resources ./resources/ \
    --scripts ./scripts/ \
    --root-volume-only \
    --domain system \
    --verbose \
    --no-relocate \
    --target 10.5 \
    --id com.my_company.pkg \
    --out MyProgram.pkg

Teraz próbuję napisać to z pkgbuild i mając poważny problem. Używam następującego połączenia:

$ pkgbuild \
    --root /some_path \
    --version 1.0.0 \
    --install-location "/" \
    --scripts "./scripts/" \
    --identifier "com.my_company.pkg" \
    MyProgram.pkg

To polecenie tworzy instalator, który kopiuje katalog MyProgram.framework do katalogu / Library / Frameworks. Jednak nie instaluje pliku MyProgram.app w katalogu / Applications. Kiedy patrzę na dzienniki instalatora, widzę ten komunikat:

Aplikacje / MyProgram.app przeniesiono do   /some_path/Applications/MyProgram.app

Czy ktoś może rzucić nieco światła na to, dlaczego nie dodajemy pliku MyProgram.app do katalogu / Applications, tak jak robił to PackageMaker?


12
2017-08-03 13:30


pochodzenie




Odpowiedzi:


Niestety odpowiedź na to pytanie nie była dokładnie tym, czego szukałem. Nie mogłem wymyślić, jak wyeliminować PackageMaker z procesu. Istnieje jednak rozwiązanie, które obejmuje pkgutil wraz z PackageMaker w celu utworzenia instalatora z niestandardową wiadomością powitalną, licencją i obrazem tła w całości w wierszu poleceń. Interfejs GUI pakietu PackageMaker jest NIE wymagany. Kroki są następujące:

  1. Uruchom linia komend packagemaker plik wykonywalny na specjalnej strukturze katalogów. Ta struktura katalogów odzwierciedla system plików Mac. Czytaj więcej w starym, ale niezawodnym Poradnik "PackageMaker Porady".
  2. Uruchom pkgutil (pkgutil --expand), aby wyodrębnić zawartość pakietu
  3. Spójrz na zawartość i określ, co chcesz zmienić. Niektóre opcje to wiadomość powitalna, licencja i obraz tła.
  4. Dodaj polecenia, aby zmienić te pliki za pomocą wiersza poleceń. Przejrzyj Instrukcja "Automatyzacja programu Apple's PackageMaker" po więcej informacji. Najłatwiej jest po prostu uruchomić coś takiego echo '<background file="your_background.png">'.
  5. Uruchom pkgutil (pkgutil --flatten), aby odbudować pakiet.

4
2017-10-03 14:00





Po pierwsze, czy jesteś pewien, że potrzebujesz instalatora? Możesz umieścić szkielet wewnątrz aplikacji. Instalator i pkgbuild są, delikatnie mówiąc, nieco niestabilne.

Teraz do problemu: Relocation ma związek z faktem, że użytkownik może przenieść aplikację z / Applications to say / WorkApplications / PrivateApplications. W twoim przypadku Instalator prawdopodobnie znajdzie twoją Aplikację w folderze kompilacji i zainstaluje ją nad tym.

Myślę, że Instalator używa identyfikatora pakietu aplikacji i Spotlight do relokacji, więc do testowania można dodać folder kompilacji do listy ignorowania Spotlight.

Możesz zdefiniować w Lista właściwości składnika  BundleIsRelocatable. Jeśli naprawdę musisz zainstalować globalną strukturę, jest to jeden pakiet, w którym chcesz ustawić BundleIsRelocatable na false.


1
2017-08-03 14:56





Pytanie, do którego się odwołujesz ma prawie wszystko, czego potrzebujesz, aby całkowicie wyeliminować Kreatora pakietów. Jedną z rzeczy, którą dodałem, jest użycie sed po productbuild --synthesize ... wywołanie, aby wstawić linie do pliku dystrybucyjnego. Na przykład, oto niektóre polecenia terminala, których używam, gdy już zbudowałem pakiet komponentów:

productbuild --synthesize --package "components/SubPackage.pkg" "distribution.xml"
sed -i "" \
-e '$ i\
\    <title>Installer Title</title>' \
-e '$ i\
\    <background file="background.png" alignment="left" scaling="proportional" />' \
-e '$ i\
\    <welcome file="welcome.rtf" />' \
"distribution.xml"
productbuild --distribution "distribution.xml" --resources "resources/" --package-path "components/" "Installer.pkg"

Pozwala to uniknąć konieczności używania pkgutil --expand i pkgutil --flatten aby zmodyfikować instalator.


1
2018-04-26 16:41