Udostępnij przez


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 projektowej pod kątem strategii uaktualniania. Strategia określa, czy fabryka projektów obsługuje kopie zapasowe lub 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, UpgradeProject jest wywoływana w każdej fabryce projektów w 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 z fabryk projektów może wybrać instancjonowanie projektu. Implementacja projektu musi obsługiwać element IVsProjectUpgrade. Następnie metoda UpgradeProject jest wywoływana w celu aktualizacji wszystkich odpowiednich elementów projektu.

Uwaga / Notatka

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 realizację wykonywania kopii zapasowych i uaktualnień, umożliwiając obsługę plików projektu znajdujących się pod kontrolą źródła, plików z niewystarczającymi uprawnieniami itp.

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ć proces uaktualniania, który pozwala na uczestnictwo w Kreatorze konwersji programu Visual Studio, zaimplementuj interfejs IVsProjectUpgradeViaFactory. 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 użycie IVsProjectUpgradeViaFactory do implementacji kopii i projektowania tylko części uaktualnienia oraz powierzenie realizacji pozostałej części pracy, być może w nowej lokalizacji, za pomocą interfejsu IVsProjectUpgrade.

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 informujący 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, aktualizacja zostanie zaimplementowana jako bezpośrednia aktualizacja 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, środowisko poprosiło użytkownika o przeprowadzenie bezpośredniego uaktualnienia pliku projektu po otwarciu projektu. Na przykład środowisko monituje użytkownika o uaktualnienie, gdy użytkownik otworzy starszą wersję rozwiązania.

  • Jeśli UPF_SILENTMIGRATE flaga nie jest podana 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 ze starszą wersją 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

  1. Zaimplementuj metodę interfejsu IVsProjectUpgradeViaFactory, szczególnie metodę UpgradeProject w implementacji fabryki projektu, lub spraw, aby implementacje były wywoływane z implementacji fabryki projektu.

  2. Jeśli chcesz przeprowadzić aktualizację na miejscu podczas otwierania rozwiązania, użyj flagi PUVFF_SXSBACKUP jako parametru VSPUVF_FLAGS w implementacji UpgradeProject.

  3. Jeśli chcesz przeprowadzić aktualizację na miejscu w ramach otwierania rozwiązania, użyj flagi PUVFF_COPYBACKUP jako parametru VSPUVF_FLAGS w implementacji UpgradeProject.

  4. W przypadku kroków 2 i 3, rzeczywiste kroki uaktualniania plików można zaimplementować przy użyciu IVsQueryEditQuerySave2, zgodnie z opisem w poniższej sekcji "Implementowanie IVsProjectUpgade", lub można delegować rzeczywiste uaktualnienie plików do programu IVsProjectUpgrade.

  5. Użyj metod IVsUpgradeLogger do publikowania komunikatów dotyczących uaktualnienia dla użytkownika z użyciem Kreatora migracji programu Visual Studio.

  6. 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 do uaktualniania plików, które są częścią systemu zarządzania projektami, choć może nie być bezpośrednio widoczny w głównym systemie projektu. 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 projektowy implementuje tylko IVsProjectUpgrade, nie może uczestniczyć w Kreatorze konwersji programu Visual Studio. Jednak nawet jeśli implementujesz IVsProjectUpgradeViaFactory interfejs, możesz nadal delegować uaktualnienie pliku do IVsProjectUpgrade implementacji.

Aby zaimplementować IVsProjectUpgrade

  1. 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.

  2. 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 .

  3. 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:

  4. QueryEditFiles Jeśli wywołanie pliku projektu powoduje wyewidencjonowanie pliku i pobranie najnowszej wersji, projekt zostaje usunięty z pamięci i ponownie załadowany. Metoda UpgradeProject jest wywoływana ponownie, gdy zostanie utworzone inne wystąpienie projektu. Na tym drugim etapie można zapisać plik projektu na dysku; zaleca się, aby projekt zapisał kopię pliku projektu w poprzednim formacie z rozszerzeniem .OLD, wprowadził niezbędne zmiany aktualizacyjne i zapisał 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 Eksploratorze rozwiązań.

    Ważne jest, aby zrozumieć pełny proces, który ma miejsce w środowisku w przypadku, gdy wywołanie metody QueryEditFiles, określając wartość ReportOnly, zwraca flagi QER_EditNotOK i QER_ReadOnlyUnderScc.

  5. Użytkownik próbuje otworzyć plik projektu.

  6. Środowisko wywołuje twoją implementację CanCreateProject.

  7. Jeśli CanCreateProject zwraca true, wtedy środowisko wywołuje implementację CanCreateProject.

  8. Środowisko wywołuje implementację Load w celu otwarcia pliku i zainicjowania obiektu projektu, na przykład Project1.

  9. Środowisko wywołuje IVsProjectUpgrade::UpgradeProject implementację, aby określić, czy plik projektu musi zostać zaktualizowany.

  10. Wywołujesz QueryEditFiles i przekazujesz wartość QEF_ReportOnly jako parametr rgfQueryEdit.

  11. Środowisko zwraca QER_EditNotOK dla VSQueryEditResult, a bit QER_ReadOnlyUnderScc jest ustawiony w VSQueryEditResultFlags.

  12. Twoja IVsProjectUpgrade implementacja wywołuje IVsQueryEditQuerySave::QueryEditFiles (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, implementację ReloadItem (VSITEMID_ROOT) wywołuje środowisko. 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 swojego projektu, to zwracasz false dla 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:

    1. Środowisko wywołuje Close na twoim pierwszym obiekcie projektu, Project1, umieszczając ten obiekt w stanie nieaktywnym.

    2. Środowisko wywołuje IVsProjectFactory::CreateProject implementację, aby utworzyć drugą instancję Twojego projektu, Project2.

    3. Środowisko wywołuje implementację IPersistFileFormat::Load, aby otworzyć plik i zainicjować drugi obiekt projektu, Project2.

    4. Ś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 o nazwie Project2. To jest projekt otwarty w ramach rozwiązania.

      Uwaga / Notatka

      W przypadku, gdy pierwszy projekt, Project1, jest umieszczony w stanie nieaktywnym, należy zwrócić S_OK przy pierwszym wywołaniu swojej implementacji UpgradeProject.

    5. Wywołujesz QueryEditFiles i przekazujesz wartość QEF_ReportOnly jako parametr rgfQueryEdit.

    6. Środowisko zwraca QER_EditOK, a uaktualnienie może być kontynuowane, ponieważ plik projektu może być zapisany.

Jeśli uaktualnienie nie powiedzie się, wróć VS_E_PROJECTMIGRATIONFAILED z lokalizacji IVsProjectUpgrade::UpgradeProject. Jeśli uaktualnienie nie jest konieczne lub nie chcesz uaktualniać, należy traktować wywołanie IVsProjectUpgrade::UpgradeProject jako no-op. Jeśli zwrócisz VS_E_PROJECTMIGRATIONFAILED, do rozwiązania 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

  1. 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.

  2. Doradź interfejsowi za pośrednictwem metody AdviseSolutionEvents.

  3. Interfejs IVsSolutionEventsProjectUpgrade zostanie uruchomiony po zakończeniu operacji uaktualniania przez implementację systemu projektu i utworzeniu nowo uaktualnionego projektu. W zależności od scenariusza, interfejs IVsSolutionEventsProjectUpgrade jest uruchamiany po metodach OnAfterOpenSolution, OnAfterOpenProject lub OnAfterLoadProject.

Aby uaktualnić pliki elementów projektu

  1. Należy dokładnie zarządzać procesem tworzenia kopii zapasowej plików w implementacji elementu projektu. Dotyczy to w szczególności tworzenia kopii zapasowej metodą równoległą, kiedy parametr fUpgradeFlag metody UpgradeProject jest ustawiony na PUVFF_SXSBACKUP, a pliki, których kopia zapasowa została utworzona, są umieszczone obok plików oznaczonych jako ".old". Pliki, które były kopią zapasową przed czasem systemowym, w którym projekt został zaktualizowany, można uznać za przestarzałe. Ponadto mogą one zostać zastąpione, chyba że podejmiesz określone kroki, aby temu zapobiec.

  2. 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 aktualizacji w interfejsie użytkownika kreatora.