jak zmusić Xcode do odbudowy informacji.plik plist w moim projekcie za każdym razem, gdy buduję projekt?

Najwyraźniej plik jest buforowany, więc buduje się go tylko wtedy, gdy zostanie zmieniony. Mam zmienne środowiskowe ustawione, aby zwiększyć mój numer wersji choć, i takie, i aktualizować je niezależnie od plist(w Ustawieniach budowania projektu, faktycznie). Czy istnieje skrypt, który mogę użyć jako fazy budowania skryptu, który wymusi informacje.plist do aktualizacji? Jakiś inny wygodny sposób?

Author: TraxusIV, 2010-09-16

10 answers

Wybierz "Edytuj schemat" , a następnie wybierz "Zbuduj" z kontrolki po lewej stronie.

Następnie dodaj krok przed akcjami, upewnij się, że dany schemat został wybrany w pulldownie "podaj ustawienia budowania z", a następnie dodaj go do okna edycji poniżej:

rm "${CONFIGURATION_BUILD_DIR}/${INFOPLIST_PATH}"

Spowoduje to usunięcie buforowanej wersji Info.plist, powodując, że XCode odbuduje ją za każdym razem, gdy naciśniesz build.

 13
Author: LeeH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-08 15:24:50

Ja też mam automatyczne ustawianie numerów wersji. Stworzyłem Run Script fazę budowania. Kluczem jest aktualizacja docelowej kopii katalogu budowania informacji.plist nie buduje katalogu jeden. Musisz również uruchomić skrypt po fazie kopiowania pakietu. Można edytować plik bundle bezpośrednio, ponieważ jest przed podpisaniem kodu. Nie chcesz generować pliku, który na nowo tworzy koło.

Oto mój scenariusz:

# ---------------------------- IMPORTANT ----------------------------
# You must set GITHash to something like 'Set by build script' in the file
# file '<Project Name>-Info.plist' in the 'Supporting Files' group
# -------------------------------------------------------------------
#
# Get the version number from the tag in git and the number of commits as the build number
#
appVersion=$(git describe --long | cut -f 1 -d "-") 
appBuild=$(git describe --long | cut -f 2 -d "-") 
gitHash=$(git describe --long | cut -f 3 -d "-")
echo "From GIT Version = $appVersion Build = $appBuild"

#
# Set the version info in plist file
#
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $appVersion" "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}"
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $appBuild" "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}"
/usr/libexec/PlistBuddy -c "Set :GITHash $gitHash" "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}"
echo "Updated ${TARGET_BUILD_DIR}/${INFOPLIST_PATH}"

FYI i również auto set the wersja i zbuduj na karcie Informacje o następującym kodzie

NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
NSString *appDisplayName = infoDictionary[@"CFBundleDisplayName"];
NSString *majorVersion = infoDictionary[@"CFBundleShortVersionString"];
NSString *minorVersion = infoDictionary[@"CFBundleVersion"];

self.appDescription.text = [NSString stringWithFormat:@"Dirty Dog Software\n%@\nVersion: %@(%@)",
                       appDisplayName, majorVersion, minorVersion];                           
 14
Author: GayleDDS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-02 07:16:36

Możesz spróbować użyć polecenia touch, aby zaktualizować znacznik czasu, który zakładam, że jest tym, czego używa Xcode, aby określić, czy należy go przebudować, np.

$ touch Info.plist
 12
Author: bosmacs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-16 19:50:18

Jednym ze sposobów, aby to zrobić, byłoby uruchomienie fazy budowania skryptu, aby wygenerować Info.plist z pliku Info.plist.template, a następnie rm Info.plist Po utworzeniu pakietu. Pomysł z komentarza Dave DeLong zamieszczonego na swoim blogu tutaj .

Jeśli buforowanie jest dość poważne (tj. buforowanie nawet jeśli nie masz informacji.plist otworzyć w historii plików) możesz chcieć rm buforowanej wersji, jak również w tym skrypcie.

 9
Author: darvids0n,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:30:38

W Xcode 4, można użyć pre build akcji dotknąć info plist.

Uwaga: to nie to samo, co faza budowania skryptu run. Akcja pre build dzieje się przed Xcode sprawdza plist info, Faza run script build wydaje się mieć miejsce po Xcode już sprawdził plist info (dlatego działa tylko za każdym razem).

  1. przejdź do edycji Scheme > Build > Pre-actions
  2. Kliknij przycisk " + "i wybierz" Nowa Akcja Uruchom skrypt "
  3. Wybierz swój cel w lista rozwijana" podaj ustawienia kompilacji z"
  4. Dodaj touch "${SRCROOT}/${INFOPLIST_FILE}" w polu skryptu
 5
Author: lukelutman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-18 16:44:28

Istnieje opcja w zakładce " Build "w oknie Get Info docelowego, na dole w" Packaging "oznaczonym jako" Preprocess Info.plist file", które możesz sprawdzić. Wierzę, że będzie to aktualizować plik każdego kompilacji.

 1
Author: ExitToShell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-16 20:05:46

Praca z Xcode 8.3.2

Zainspirowany odpowiedzią @LeeH z 2013 roku wymyśliłem dwa rozwiązania, aby odbudować informacje.plist.

Rozwiązanie 1: najbardziej proste i eleganckie]}

Najprostszym rozwiązaniem jest zmuszenie Xcode do odczytu niestandardowych zmiennych poprzez dotknięcie Twoich celów Info.plist.

Dodaj fazę budowania, zobacz zrzut ekranu poniżej (pierwotnie zrzut ekranu dla Rozwiązanie 2 ), i po prostu dodaj tę linię:

touch $INFOPLIST_FILE

To jest wszyscy! Teraz Xcode powinien wymusić przeładowanie Zmiennych Niestandardowych do pliku Info.plist.

To rozwiązanie jest takie samo jak sugerował @lukelutman, ale za pomocą fazy budowania. Skrypt Pre-action nie działał dla mnie.

Rozwiązanie 2: bardziej złożone i chwiejne

Innym rozwiązaniem jest usunięcie pamięci podręcznej Info.plist w katalogu budowania .

Napisałem ten super prosty mały skrypt bash

#!/bin/bash
info_plist="$CONFIGURATION_BUILD_DIR/$PRODUCT_NAME.app/Info.plist"
echo "Removing Info.plist from build dir in order to force rebuild of it and reading of correct xcconfig variables, plist path $info_plist"
rm "$info_plist"

Następnie zapisałem go i nazwałem z faz budowania celu. I postaw to jako pierwszy etap budowy.

Tutaj wpisz opis obrazka

Tło:

Mam trzy różne konfiguracje: Config, Alpha, AppStore a ja używam uniwersalnych linków, powiadomień Push i innych pracowników, które wymagają użycia pliku uprawnień. Ale nie chciałem mieć trzech plików uprawnień, po jednym dla każdej konfiguracji.

Mój projekt opiera się już w dużej mierze na plikach konfiguracyjnych (.xcconfig). Skonfigurowałem plik uprawnień (MyAppsProductName.entitlements) używając custom config zmienne.

Ale chciałem przeczytać te same zmienne konfiguracyjne runtime, pomyślałem, że mogę to zrobić, jeśli zostaną dodane do moich informacji o celach.plist. Co zadziałało!

Ale zauważyłem, że gdy zmieniłem wartości w moim pliku .xcconfig, to plik Info.plist nie zmienił wartości. Zauważyłem, że jeśli wykonałem czystą kompilację, to wartości w Info.plist dostały aktualizacje zgodnie z wartościami wewnątrz pliku .xcconfig. Xcode rzeczywiście buforuje plik Info.plist.

Więc te rozwiązania powyżej rozwiązuje ten problem. Mam nadzieję, że to pomoże! :)

Dyskusja

Nie mam pojęcia, czy Rozwiązanie 2 ma jakąś przewagę nad rozwiązanie 1 ... Pewnie nie? Ktoś ma coś do powiedzenia?

 1
Author: Sajjon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-24 13:13:39

Upewnij się, że odświeżysz widok plist.
Podczas przeglądania plist w Xcode wystarczy kliknąć Trójkąt ujawnienia obok elementu głównego w plist (Information Property List). A następnie kliknij go ponownie, aby go rozwinąć.
Zobaczysz, że wartości zostały odświeżone. Uruchamiałem podobny skrypt i myślałem, że działa tylko sporadycznie, dopóki nie zdałem sobie sprawy, że widok plist nie był po prostu odświeżający.

 0
Author: Andrew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-17 02:06:23

Innym podejściem jest stworzenie "zagregowanego" celu, który ma tylko fazę budowania. Użyj tego, aby dotknąć informacji.plik plist. Uczyń ten cel zależnością od celu, który buduje Twoją aplikację.

Ponieważ jest to oddzielny cel i zależność od celu aplikacji, zostanie zbudowany przed informacjami o celu aplikacji.pliki plist są nawet sprawdzane. (Jak wspomniano w innym miejscu, fazy budowania samego celu aplikacji zdarzają się zbyt późno, po czasie modyfikacji informacji.pliki plist zostały już sprawdzone.)

 0
Author: Ken Thomases,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-29 19:58:13

Dla tych, którzy mieli problemy z uzyskaniem projektu do automatycznego wersjonowania, stworzyłem projektMacOS GitHub , który pokazuje, jak zaimplementować go w bardzo prosty i prosty sposób, dzięki pomysłom @GayleDDS i Daniela Farrelly ' ego i jego bloga o wersjonowaniu i niektórych implementacjach moich własnych. Myślę, że możesz bez problemu przełożyć to na swoje projekty na innych platformach.

Oto mały przewodnik jak można replikować go w swoich projektach (Xcode 8).

  1. aby zmniejszyć szanse na to, że się pomylisz, upewnij się, że wcześniej dodałeś wszystkie swoje cele do swojego projektu.
  2. przejdź do menu Plik > Nowy plik... a następnie przewiń w dół i wybierz plik ustawień konfiguracyjnych
  3. nazwij go BuildNumber i nie zapomnij dodać ten plik konfiguracyjny do wszystkich celów , które chcesz synchronizować; zrób to, klikając odpowiednie pola wyboru przed zapisaniem tego plik
  4. powinieneś zobaczyć plik o nazwie BuildNumber.xcconfig pojawiający się w Twoim projekcie
  5. Dodaj do tego pliku następujący tekst: CURRENT_PROJECT_VERSION = 1. Jeśli chcesz, możesz zacząć od innego numeru. To będzie Twój numer kompilacji, który będzie zwiększany za każdym razem, gdy zbudujesz. proszę nie zmieniać nazwy zmiennej, chociaż .
  6. Jeśli masz więcej niż jeden obiekt docelowy, Dodaj następujący skrypt do pierwszego obiektu docelowego, który został zbudowany, przechodząc do Project > Target > Build Fazy
  7. przejdź do menu edytor > Dodaj fazę budowania > Dodaj fazę uruchamiania skryptu
  8. a Run Script phase powinien być dodany do celu; więc przeciągnij go, aż będzie pod zależności docelowe (ten szczegół jest ważny!).
  9. teraz przychodzi ciekawa część i wyjaśnię skrypt prawie linia po linii:

Zacznij od utworzenia ścieżki do PlistBuddy w pierwszej linii skryptu:

plistbuddy="/usr/libexec/PlistBuddy"

Dodaj wiersz 2 do przeczytaj plik konfiguracyjny, a następnie odczytaj zmienną CURRENT_PROJECT_VERSION skonfigurowaną w kroku 5.

OLD_VERSION=`cat "$SRCROOT/BuildNumber.xcconfig" | awk '/CURRENT_PROJECT_VERSION/ { print $3 }'`

Linia 3-11 ustawia NEW_VERSION z podaną wartością, a następnie zapisuje plik konfiguracyjny z nowym numerem kompilacji; pozostałe linie mają zapisać wersję marketingową i numer kompilacji do plista:

NEW_VERSION=`cat "$SRCROOT/BuildNumber.xcconfig" | awk '/CURRENT_PROJECT_VERSION/ { print $3 + 1 }'`
sed -i '' "s/CURRENT_PROJECT_VERSION = .*/CURRENT_PROJECT_VERSION = $NEW_VERSION/" "$SRCROOT/BuildNumber.xcconfig"
CURRENT_PROJECT_VERSION=$NEW_VERSION
BUILD_STR="Build $NEW_VERSION"
COPYRIGHT_STR="© 2017 MyCompany.net"
APP_VERSION_STR="1.3.5"
$plistbuddy -c "Set :CFBundleShortVersionString $APP_VERSION_STR" "${SRCROOT}/$TARGETNAME/Info.plist"
$plistbuddy -c "Set :CFBundleVersion $BUILD_STR" "${SRCROOT}/$EXECUTABLE_NAME/Info.plist"
$plistbuddy -c "Set :NSHumanReadableCopyright $COPYRIGHT_STR" "$INFOPLIST_FILE"

Pokazuję również w liniach 8-11 jak używać różnych zmiennych środowiskowych, które Xcode ustawia dla swoich skryptów. Możesz dodać dodatkowe linie, aby edytować informacje.plist dla innych następnie Synchronizuj wersję głównej aplikacji i jej pomocników. Przejdź do GitHub , Pobierz projekt i pobaw się nim, a następnie dostosuj go do swoich potrzeb. Szczęśliwe automatyczne wersjonowanie z Xcode.

 0
Author: jvarela,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-07 20:45:52