Uaktualnianie projektów
Zmiany w modelu projektu z jednej wersji programu Visual Studio do następnej mogą wymagać uaktualnienia projektów i rozwiązań w celu uruchomienia ich w nowszej wersji. Zestaw Visual Studio SDK udostępnia interfejsy, które mogą służyć do implementowania obsługi uaktualniania we własnych projektach.
Strategie uaktualniania
Aby zapewnić obsługę uaktualnienia, implementacja systemu projektu musi definiować i implementować strategię uaktualniania. Podczas określania strategii możesz wybrać obsługę kopii zapasowych równoległych (SxS), kopii zapasowej lub obu tych opcji.
Kopia zapasowa SxS oznacza, że projekt kopiuje tylko te pliki, które wymagają uaktualnienia, dodając odpowiedni sufiks nazwy pliku, na przykład ".old".
Kopia zapasowa kopiowania oznacza, że projekt kopiuje wszystkie elementy projektu do lokalizacji kopii zapasowej udostępnionej przez użytkownika. Odpowiednie pliki w oryginalnej lokalizacji projektu są następnie uaktualniane.
Jak działa uaktualnienie
Po otwarciu rozwiązania utworzonego we wcześniejszej wersji programu Visual Studio w nowszej wersji środowisko IDE sprawdza plik rozwiązania, aby określić, czy należy go uaktualnić. Jeśli uaktualnienie jest wymagane, Kreator uaktualniania zostanie uruchomiony automatycznie, aby przeprowadź użytkownika przez proces uaktualniania.
Gdy rozwiązanie wymaga uaktualnienia, wysyła zapytanie do każdej fabryki projektów pod kątem strategii uaktualniania. Strategia określa, czy fabryka projektów obsługuje kopie zapasowe, czy kopie zapasowe SxS. Informacje są wysyłane do Kreatora uaktualniania, który zbiera informacje wymagane do utworzenia kopii zapasowej i przedstawia odpowiednie opcje dla użytkownika.
Rozwiązania obejmujące wiele projektów
Jeśli rozwiązanie zawiera wiele projektów, a strategie uaktualniania różnią się, na przykład wtedy, gdy projekt C++ obsługujący tylko kopie zapasowe SxS i projekt sieci Web, który obsługuje tylko kopie zapasowe, fabryki projektów muszą negocjować strategię uaktualniania.
Rozwiązanie wykonuje zapytania dotyczące każdej fabryki projektów dla elementu IVsProjectUpgradeViaFactory. Następnie wywołuje metodę UpgradeProject_CheckOnly , aby sprawdzić, czy pliki projektu globalnego wymagają uaktualnienia i określić obsługiwane strategie uaktualniania. Kreator uaktualniania jest następnie wywoływany.
Po zakończeniu pracy kreatora użytkownik jest wywoływany w każdej fabryce projektów w UpgradeProject celu przeprowadzenia rzeczywistego uaktualnienia. Aby ułatwić tworzenie kopii zapasowych, metody IVsProjectUpgradeViaFactory udostępniają usługę SVsUpgradeLogger do rejestrowania szczegółów procesu uaktualniania. Nie można buforować tej usługi.
Po zaktualizowaniu wszystkich odpowiednich plików globalnych każda fabryka projektów może wybrać utworzenie wystąpienia projektu. Implementacja projektu musi obsługiwać element IVsProjectUpgrade. Następnie wywoływana UpgradeProject jest metoda w celu uaktualnienia wszystkich odpowiednich elementów projektu.
Uwaga
Metoda UpgradeProject nie udostępnia usługi SVsUpgradeLogger. Tę usługę można uzyskać, wywołując polecenie QueryService.
Najlepsze praktyki
SVsQueryEditQuerySave Użyj usługi, aby sprawdzić, czy można edytować plik przed jego edycją, i zapisać go przed zapisaniem. Ułatwi to wykonywanie kopii zapasowych i uaktualnianie implementacji do obsługi plików projektu pod kontrolą źródła, plików z niewystarczającymi uprawnieniami itd.
SVsUpgradeLogger Użyj usługi we wszystkich fazach tworzenia kopii zapasowej i uaktualniania, aby uzyskać informacje o powodzeniu lub niepowodzeniu procesu uaktualniania.
Aby uzyskać więcej informacji na temat tworzenia kopii zapasowych i uaktualniania projektów, zobacz komentarze dotyczące projektu IVsProjectUpgrade w programie vsshell2.idl.
Uaktualnianie projektów niestandardowych
Jeśli zmienisz informacje utrwalone w pliku projektu między różnymi wersjami programu Visual Studio produktu, musisz obsługiwać uaktualnianie pliku projektu ze starej do nowej wersji. Aby obsługiwać uaktualnianie, które umożliwia uczestnictwo w Kreatorze konwersji programu Visual Studio, zaimplementuj IVsProjectUpgradeViaFactory interfejs. Ten interfejs zawiera jedyny mechanizm dostępny do uaktualniania kopii. Uaktualnienie projektu odbywa się w ramach otwieranego rozwiązania. Interfejs IVsProjectUpgradeViaFactory jest implementowany przez fabrykę projektu lub powinien być przynajmniej możliwy do uzyskania z fabryki projektu.
Stary mechanizm korzystający z interfejsu IVsProjectUpgrade jest nadal obsługiwany, ale koncepcyjnie uaktualnia system projektu w ramach otwartego projektu. Dlatego IVsProjectUpgrade interfejs jest wywoływany przez środowisko programu Visual Studio, nawet jeśli IVsProjectUpgradeViaFactory interfejs jest wywoływany lub implementowany. Takie podejście umożliwia IVsProjectUpgradeViaFactory zaimplementowanie kopii i projektu tylko części uaktualnienia oraz delegowanie pozostałej części pracy w miejscu (prawdopodobnie w nowej lokalizacji) przez IVsProjectUpgrade interfejs.
Aby zapoznać się z przykładową implementacją programu IVsProjectUpgrade, zobacz przykłady zestawu VSSDK.
W przypadku uaktualnień projektu pojawiają się następujące scenariusze:
Jeśli plik ma nowszy format niż projekt może obsługiwać, musi zostać zwrócony błąd z informacją o tym. Przyjęto założenie, że starsza wersja produktu zawiera kod umożliwiający sprawdzenie wersji.
Jeśli flaga PUVFF_SXSBACKUP zostanie określona w metodzie UpgradeProject , uaktualnienie zostanie zaimplementowane jako uaktualnienie w miejscu przed otwarciem projektu.
Jeśli flaga jest określona PUVFF_COPYBACKUP w metodzie UpgradeProject , uaktualnienie jest implementowane jako uaktualnienie kopii.
Jeśli flaga UPF_SILENTMIGRATE jest określona w wywołaniu UpgradeProject , użytkownik został poproszony przez środowisko o uaktualnienie pliku projektu jako uaktualnienia w miejscu po otwarciu projektu. Na przykład środowisko monituje użytkownika o uaktualnienie, gdy użytkownik otworzy starszą wersję rozwiązania.
Jeśli flaga nie jest określona UPF_SILENTMIGRATE w wywołaniu UpgradeProject , musisz poprosić użytkownika o uaktualnienie pliku projektu.
Poniżej znajduje się przykładowy komunikat monitu o uaktualnienie:
"Projekt %1 został utworzony przy użyciu starszej wersji programu Visual Studio. Jeśli otworzysz go przy użyciu tej wersji programu Visual Studio, być może nie będzie można otworzyć go ze starszymi wersjami programu Visual Studio. Czy chcesz kontynuować i otworzyć ten projekt?"
Aby zaimplementować IVsProjectUpgradeViaFactory
Zaimplementuj metodę interfejsu IVsProjectUpgradeViaFactory , w szczególności UpgradeProject metodę w implementacji fabryki projektu lub wykonaj wywołanie implementacji z implementacji fabryki projektu.
Jeśli chcesz przeprowadzić uaktualnienie w miejscu w ramach otwierania rozwiązania, podaj flagę PUVFF_SXSBACKUP jako
VSPUVF_FLAGS
parametr w UpgradeProject implementacji.Jeśli chcesz przeprowadzić uaktualnienie w miejscu w ramach otwierania rozwiązania, podaj flagę PUVFF_COPYBACKUP jako
VSPUVF_FLAGS
parametr w UpgradeProject implementacji.W przypadku kroków 2 i 3 rzeczywistych kroków uaktualniania plików można zaimplementować przy użyciu metody IVsQueryEditQuerySave2, zgodnie z opisem w poniższej sekcji "Implementowanie
IVsProjectUpgade
" lub delegować rzeczywiste uaktualnienie pliku do IVsProjectUpgradeprogramu .Użyj metod publikowania komunikatów powiązanych IVsUpgradeLogger z uaktualnieniem dla użytkownika przy użyciu Kreatora migracji programu Visual Studio.
IVsFileUpgrade Interfejs służy do implementowania dowolnego rodzaju uaktualnienia plików, które musi nastąpić w ramach uaktualnienia projektu. Ten interfejs nie jest wywoływany z IVsProjectUpgradeViaFactoryprogramu , ale jest dostarczany jako mechanizm uaktualniania plików, które są częścią systemu projektu, ale główny system projektu może nie być bezpośrednio świadomy. Na przykład taka sytuacja może wystąpić, jeśli pliki i właściwości powiązane z kompilatorem nie są obsługiwane przez ten sam zespół programistyczny, który obsługuje pozostałą część systemu projektu.
Implementacja IVsProjectUpgrade
Jeśli system projektu implementuje IVsProjectUpgrade tylko, nie może uczestniczyć w Kreatorze konwersji programu Visual Studio. Jednak nawet jeśli implementujesz IVsProjectUpgradeViaFactory interfejs, nadal można delegować uaktualnienie pliku do IVsProjectUpgrade implementacji.
Aby zaimplementować interfejs IVsProjectUpgrade
Gdy użytkownik próbuje otworzyć projekt, UpgradeProject metoda jest wywoływana przez środowisko po otwarciu projektu i przed podjęciem jakiejkolwiek innej akcji użytkownika w projekcie. Jeśli użytkownik został już poproszony o uaktualnienie rozwiązania, flaga UPF_SILENTMIGRATE zostanie przekazana w parametrze
grfUpgradeFlags
. Jeśli użytkownik otworzy projekt bezpośrednio, na przykład za pomocą polecenia Dodaj istniejący projekt , flaga UPF_SILENTMIGRATE nie zostanie przekazana, a projekt musi monitować użytkownika o uaktualnienie.W odpowiedzi na wywołanie UpgradeProject projekt musi ocenić, czy plik projektu został uaktualniony. Jeśli projekt nie musi uaktualnić typu projektu do nowej wersji, może po prostu zwrócić flagę S_OK .
Jeśli projekt musi uaktualnić typ projektu do nowej wersji, musi określić, czy plik projektu można zmodyfikować, wywołując QueryEditFiles metodę i przekazując wartość tagVSQueryEditFlags parametru
rgfQueryEdit
. Następnie projekt musi wykonać następujące czynności:Jeśli wartość zwrócona
VSQueryEditResult
w parametrzepfEditCanceled
to QER_EditOK, uaktualnienie może kontynuować, ponieważ plik projektu można zapisać.VSQueryEditResult
Jeśli wartość zwrócona w parametrzepfEditCanceled
to QER_EditNotOK , aVSQueryEditResult
wartość ma QER_ReadOnlyNotUnderScc zestaw bitów, musi UpgradeProject zwrócić błąd, ponieważ użytkownicy powinni rozwiązać problem z uprawnieniami samodzielnie. Następnie projekt powinien wykonać następujące czynności:Zgłoś błąd użytkownikowi, wywołując ReportErrorInfo polecenie i zwracając kod błędu VS_E_PROJECTMIGRATIONFAILED do IVsProjectUpgrade.
VSQueryEditResult
Jeśli wartość to QER_EditNotOK , aVSQueryEditResultFlags
wartość ma QER_ReadOnlyUnderScc ustawiony bit, plik projektu powinien zostać wyewidencjonowany przez wywołanie QueryEditFiles (QEF_ForceEdit_NoPrompting, QEF_DisallowInMemoryEdits,...).
QueryEditFiles Jeśli wywołanie pliku projektu spowoduje wyewidencjonowanie pliku i pobranie najnowszej wersji, projekt zostanie zwolniony i ponownie załadowany. Metoda jest wywoływana UpgradeProject ponownie po utworzeniu innego wystąpienia projektu. W tym drugim wywołaniu plik projektu można zapisać na dysku; Zaleca się, aby projekt zapisywał kopię pliku projektu w poprzednim formacie przy użyciu elementu . STARE rozszerzenie, wprowadź niezbędne zmiany uaktualnienia i zapisz plik projektu w nowym formacie. Ponownie, jeśli którakolwiek część procesu uaktualniania zakończy się niepowodzeniem, metoda musi wskazywać błąd, zwracając polecenie VS_E_PROJECTMIGRATIONFAILED. Powoduje to zwolnienie projektu w Eksplorator rozwiązań.
Ważne jest, aby zrozumieć pełny proces, który występuje w środowisku w przypadku, gdy wywołanie QueryEditFiles metody (określając wartość ReportOnly) zwraca QER_EditNotOK flagi i QER_ReadOnlyUnderScc .
Użytkownik próbuje otworzyć plik projektu.
Środowisko wywołuje implementację CanCreateProject .
Jeśli CanCreateProject funkcja zwraca
true
wartość , środowisko wywołuje implementację CanCreateProject .Środowisko wywołuje Load implementację, aby otworzyć plik i zainicjować obiekt projektu, na przykład Project1.
Środowisko wywołuje
IVsProjectUpgrade::UpgradeProject
implementację, aby określić, czy plik projektu musi zostać uaktualniony.QueryEditFiles Wywołujesz i przekazujesz wartość QEF_ReportOnly parametru
rgfQueryEdit
.Środowisko zwraca QER_EditNotOK wartość ,
VSQueryEditResult
a bit jest ustawiony w elem QER_ReadOnlyUnderSccVSQueryEditResultFlags
.Wywołania IVsProjectUpgrade
IVsQueryEditQuerySave::QueryEditFiles
implementacji (QEF_ForceEdit_NoPrompting, QEF_DisallowInMemoryEdits).
To wywołanie może spowodować wyewidencjonowanie nowej kopii pliku projektu i pobranie najnowszej wersji, a także konieczność ponownego załadowania pliku projektu. W tym momencie dzieje się jedna z dwóch rzeczy:
Jeśli obsłużysz ponowne ładowanie projektu, środowisko wywołuje ReloadItem implementację (VSITEMID_ROOT). Po otrzymaniu tego wywołania załaduj ponownie pierwsze wystąpienie projektu (Project1) i kontynuuj uaktualnianie pliku projektu. Środowisko wie, że obsługujesz ponowne ładowanie projektu, jeśli wrócisz
true
do GetProperty (VSHPROPID_HandlesOwnReload).Jeśli nie obsłużysz ponownego załadowania projektu, zwracasz wartość
false
GetProperty (VSHPROPID_HandlesOwnReload). W takim przypadku przed QueryEditFileszwróceniem (QEF_ForceEdit_NoPrompting, QEF_DisallowInMemoryEdits) środowisko tworzy kolejne nowe wystąpienie projektu, na przykład Project2, w następujący sposób:Środowisko wywołuje Close pierwszy obiekt projektu Project1, umieszczając ten obiekt w stanie nieaktywnym.
Środowisko wywołuje
IVsProjectFactory::CreateProject
implementację, aby utworzyć drugie wystąpienie projektu Project2.Środowisko wywołuje
IPersistFileFormat::Load
implementację, aby otworzyć plik i zainicjować drugi obiekt projektu Project2.Środowisko wywołuje
IVsProjectUpgrade::UpgradeProject
po raz drugi, aby określić, czy obiekt projektu ma zostać uaktualniony. Jednak to wywołanie jest wykonywane w nowym, drugim wystąpieniu projektu, Project2. Jest to projekt otwarty w rozwiązaniu.Uwaga
W przypadku, gdy pierwszy projekt, Project1, jest umieszczony w stanie nieaktywnym, musisz wrócić S_OK z pierwszego wywołania do UpgradeProject implementacji.
QueryEditFiles Wywołujesz i przekazujesz wartość QEF_ReportOnly parametru
rgfQueryEdit
.Środowisko zwraca i QER_EditOK uaktualnienie może kontynuować, ponieważ można zapisać plik projektu.
Jeśli uaktualnienie nie powiedzie się, wróć VS_E_PROJECTMIGRATIONFAILED z lokalizacji IVsProjectUpgrade::UpgradeProject
. Jeśli uaktualnienie nie jest konieczne lub nie zdecydujesz się na uaktualnienie, należy traktować IVsProjectUpgrade::UpgradeProject
wywołanie jako no-op. Jeśli zwrócisz VS_E_PROJECTMIGRATIONFAILEDelement , do rozwiązania dla projektu zostanie dodany węzeł zastępczy.
Uaktualnianie elementów projektu
Jeśli dodasz elementy do systemów projektów, które nie zostaną zaimplementowane lub zarządzasz nimi, może być konieczne uczestnictwo w procesie uaktualniania projektu. Crystal Reports to przykład elementu, który można dodać do systemu projektu.
Zazwyczaj implementacje elementów projektu chcą korzystać z już w pełni utworzonego i uaktualnionego projektu, ponieważ muszą wiedzieć, jakie są odwołania do projektu i jakie są inne właściwości projektu, aby podjąć decyzję o uaktualnieniu.
Aby uzyskać powiadomienie o uaktualnieniu projektu
Ustaw flagę (zdefiniowaną SolutionOrProjectUpgrading w pliku vsshell80.idl) w implementacji elementu projektu. Powoduje to automatyczne ładowanie elementu projektu VSPackage, gdy powłoka programu Visual Studio określa, że system projektu jest w trakcie uaktualniania.
IVsSolutionEventsProjectUpgrade Poinformuj interfejs za pomocą AdviseSolutionEvents metody .
Interfejs IVsSolutionEventsProjectUpgrade zostanie wyzwolony po zakończeniu operacji uaktualniania przez implementację systemu projektu i utworzeniu nowego uaktualnionego projektu. W zależności od scenariusza IVsSolutionEventsProjectUpgrade interfejs jest uruchamiany po metodach OnAfterOpenSolutionOnAfterOpenProject, lub OnAfterLoadProject .
Aby uaktualnić pliki elementów projektu
Należy dokładnie zarządzać procesem tworzenia kopii zapasowej plików w implementacji elementu projektu. Dotyczy to w szczególności kopii zapasowej side-by-side, gdzie
fUpgradeFlag
parametr UpgradeProject metody jest ustawiony na PUVFF_SXSBACKUP, gdzie pliki, których kopia zapasowa została utworzona, są umieszczane wzdłuż plików bocznych, które są oznaczone jako ".old". Kopię zapasową plików starszych niż czas systemowy, kiedy projekt został uaktualniony, można wyznaczyć jako nieaktualne. Ponadto mogą one zostać zastąpione, chyba że podejmiesz określone kroki, aby temu zapobiec.W momencie, gdy element projektu otrzymuje powiadomienie o uaktualnieniu projektu, Kreator konwersji programu Visual Studio jest nadal wyświetlany. W związku z tym należy użyć metod interfejsu IVsUpgradeLogger w celu udostępnienia komunikatów uaktualniania do interfejsu użytkownika kreatora.