2012-08-03 9 views
12

Próbowałem przesłać kompilację wiersza polecenia na komputerze Mac PackageMaker do pkgbuild i productbuild, ale utknąłem. Niestety nie znalazłem wiele z niczego udokumentowania, jak działają te nowe programy, z wyjątkiem tych stron man StackOverflow post i pkgbuild i productbuild.Porting PackageMaker - komenda instalująca kompilator do pkgbuild

Oto mój problem. Został utworzony katalog główny instalacji, która ma następujące pliki w nim: poniżej

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

Linia wywołanie polecenia pracował wielki dla 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ące połączenia:

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

Komenda ta buduje instalator kopiuje katalog MyProgram.framework w/Library/Frameworks. Jednak nie instaluje pliku MyProgram.app w katalogu/Applications. Kiedy patrzę na dzienników instalatora widzę komunikat:

Applications/MyProgram.app przeniesiona do /some_path/Applications/MyProgram.app

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

Odpowiedz

4

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ń. GUI PackageMaker to NOT wymagane. Kroki są następujące:

  1. Uruchom plik wykonywalny packagemaker command line w specjalnej strukturze katalogów. Ta struktura katalogów odzwierciedla system plików Mac. Przeczytaj więcej w starym, ale niezawodnym "PackageMaker How-to" tutorial.
  2. Uruchom pkgutil (pkgutil --expand), aby wyodrębnić zawartość paczki
  3. Zobacz zawartość i sprawdź, co chcesz zmienić. Niektóre opcje to wiadomość powitalna, licencja i obraz tła. Polecenia
  4. Do zmiany tych plików poprzez linię poleceń. Przejrzyj "Automating Apple's PackageMaker" tutorial, aby uzyskać więcej informacji. Najprostszym sposobem jest uruchomienie czegoś takiego: echo '<background file="your_background.png">'.
  5. Run pkgutil (pkgutil --flatten) odbudować pakiet.
1

Przede wszystkim, 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 na problem: Relokacja 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.

Wydaje mi się, że instalator używa identyfikatora pakietu aplikacji i reflektora do przeniesienia, więc do testowania można dodać folder kompilacji do listy ignorowania Spotlight.

Możesz zdefiniować w Component Property ListBundleIsRelocatable. Jeśli naprawdę musisz zainstalować globalną strukturę, jest to jeden pakiet, w którym chcesz ustawić BundleIsRelocatable na false.

1

The question you reference ma prawie wszystko, czego potrzebujesz, aby całkowicie wyeliminować Kreatora pakietów. Jedną z rzeczy, którą dodałem, jest użycie sed po wywołaniu productbuild --synthesize ... w celu wstawienia linii do pliku dystrybucyjnego. Na przykład, oto kilka komend terminalowych używam raz ja już wbudowany pakiet komponent:

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" 

ten unika konieczności korzystania pkgutil --expand i pkgutil --flatten zmodyfikować instalator.