Udostępnij przez


Integracja z programem Visual Studio (MSBuild)

Program Visual Studio hostuje program MSBuild w celu załadowania i skompilowania zarządzanych projektów. Ponieważ program MSBuild jest odpowiedzialny za projekt, prawie każdy projekt w formacie MSBuild może być pomyślnie używany w programie Visual Studio, nawet jeśli projekt został utworzony przez inne narzędzie i ma dostosowany proces kompilacji.

W tym artykule opisano konkretne aspekty hostingu MSBuild programu Visual Studio, które należy wziąć pod uwagę podczas dostosowywania projektów i plików docelowych , które chcesz załadować i skompilować w programie Visual Studio. Te wskazówki pomogą ci się upewnić, że funkcje programu Visual Studio, takie jak IntelliSense i debugowanie, działają poprawnie dla twojego projektu niestandardowego.

Aby uzyskać informacje o projektach języka C++, zobacz Pliki projektu.

Rozszerzenia nazw plików projektu

MSBuild.exe rozpoznaje rozszerzenie nazwy pliku projektu zgodne ze wzorcem .*proj. Jednak program Visual Studio rozpoznaje tylko podzbiór tych rozszerzeń nazw plików projektu, które określają system projektu specyficzny dla języka, który załaduje projekt. Program Visual Studio nie ma neutralnego dla języka systemu projektu MSBuild.

Na przykład system projektu C# ładuje pliki csproj , ale program Visual Studio nie może załadować pliku .xxproj . Plik projektu dla plików źródłowych w dowolnym języku musi używać tego samego rozszerzenia co pliki projektu Visual Basic lub C#, które mają zostać załadowane w programie Visual Studio.

Alternatywnie rozszerzenie *.msbuildproj jest obsługiwane.

Dobrze znane nazwy docelowe

Kliknięcie polecenia Build w programie Visual Studio spowoduje wykonanie domyślnego obiektu docelowego w projekcie. Często ten cel nosi również nazwę Build. Wybranie polecenia Skompiluj lub Wyczyść spowoduje próbę wykonania elementu docelowego o tej samej nazwie w projekcie. Kliknięcie pozycji Publikuj spowoduje wykonanie obiektu docelowego o nazwie PublishOnly w projekcie.

Konfiguracje i platformy

Konfiguracje są reprezentowane w projektach MSBuild według właściwości pogrupowanych w elemecie PropertyGroup zawierającym Condition atrybut. Program Visual Studio analizuje te warunki w celu utworzenia listy konfiguracji i platform projektu do wyświetlenia. Aby pomyślnie wyodrębnić tę listę, warunki muszą mieć format podobny do następującego:

Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "
Condition=" '$(Configuration)' == 'Release' " 
Condition=" '$(Something)|$(Configuration)|$(SomethingElse)' == 'xxx|Debug|yyy' "

Program Visual Studio analizuje warunki na elementach PropertyGroup, ItemGroup, Import, właściwości i elementach w tym celu.

Dodatkowe akcje kompilacji

Program Visual Studio umożliwia zmianę nazwy typu elementu pliku w projekcie za pomocą właściwości Akcja kompilacji okna Właściwości pliku . Nazwy typów elementów Compile, EmbeddedResource, Content i None są zawsze wyświetlane w tym menu wraz z innymi nazwami typów elementów już w projekcie. Aby upewnić się, że wszystkie niestandardowe nazwy typów elementów są zawsze dostępne w tym menu, możesz dodać nazwy do typu elementu o nazwie AvailableItemName. Na przykład dodanie następującego kodu do pliku projektu spowoduje dodanie niestandardowego typu JScript do tego menu dla wszystkich projektów, które go importują:

<ItemGroup>
    <AvailableItemName Include="JScript"/>
</ItemGroup>

Dodanie nazw typów elementów do AvailableItemName typu elementu spowoduje, że elementy tego typu będą wyświetlane w Eksploratorze rozwiązań.

Uwaga / Notatka

Niektóre nazwy typów elementów są specjalne dla programu Visual Studio, ale nie są wymienione na tej liście rozwijanej.

Kompilatory w procesie

Jeśli to możliwe, Visual Studio spróbuje użyć wersji wewnątrzprocesowej kompilatora Visual Basic, aby zwiększyć wydajność. (Nie dotyczy języka C#). Aby to działało poprawnie, należy spełnić następujące warunki:

  • W obiekcie docelowym projektu musi istnieć zadanie o nazwie Vbc dla projektów Visual Basic.

  • Parametr UseHostCompilerIfAvailable zadania musi być ustawiony na wartość true.

Funkcja IntelliSense w czasie projektowania

Aby uzyskać obsługę funkcji IntelliSense w programie Visual Studio przed wygenerowaniem zestawu wyjściowego kompilacji, należy spełnić następujące warunki:

  • Musi istnieć element docelowy o nazwie Compile.

  • Obiekt docelowy Compile lub jeden z jego zależności musi wywołać zadanie kompilatora dla projektu, takie jak Csc lub Vbc.

  • Obiekt docelowy Compile lub jeden z jego zależności musi spowodować, że kompilator odbiera wszystkie niezbędne parametry funkcji IntelliSense, szczególnie wszystkie odwołania.

  • Warunki wymienione w sekcji Kompilatory procesów muszą być spełnione.

Tworzenie rozwiązań

W programie Visual Studio plik rozwiązania i kolejność kompilacji projektu są kontrolowane przez sam program Visual Studio. Podczas kompilowania rozwiązania przy użyciumsbuild.exe w wierszu polecenia program MSBuild analizuje plik rozwiązania i zamawia kompilacje projektu. W obu przypadkach projekty są kompilowane osobno w kolejności zależności, a odwołania projektu do projektu nie są przechodzone. Natomiast gdy poszczególne projekty są kompilowane przy użyciu msbuild.exe, odwołania do projektów są przeszukiwane.

Podczas kompilowania wewnątrz programu Visual Studio właściwość $(BuildingInsideVisualStudio) jest ustawiona na truewartość. Można tego używać w projekcie lub pliki .targets, aby kompilacja zachowywała się inaczej.

Wyświetlanie właściwości i elementów

Program Visual Studio rozpoznaje niektóre nazwy i wartości właściwości. Na przykład następująca właściwość w projekcie spowoduje, że aplikacja systemu Windows pojawi się w polu Typ aplikacji w projektancie projektów.

<OutputType>WinExe</OutputType>

Wartość właściwości można edytować w projektancie projektów i zapisywać w pliku projektu. Jeśli taka właściwość ma nieprawidłową wartość ręcznie edytując, program Visual Studio wyświetli ostrzeżenie po załadowaniu projektu i zastąpi nieprawidłową wartość wartością domyślną.

Program Visual Studio rozumie wartości domyślne niektórych właściwości. Te właściwości nie zostaną utrwalone w pliku projektu, chyba że mają wartości inne niż domyślne.

Właściwości o dowolnych nazwach nie są wyświetlane w programie Visual Studio. Aby zmodyfikować dowolne właściwości w programie Visual Studio, należy otworzyć plik projektu w edytorze XML i edytować je ręcznie. Aby uzyskać więcej informacji, zobacz sekcję Edytowanie plików projektu w programie Visual Studio w dalszej części tego tematu.

Elementy zdefiniowane w projekcie z dowolną nazwami typów elementów są domyślnie wyświetlane w Eksploratorze rozwiązań w węźle projektu. Aby ukryć element przed wyświetleniem, ustaw metadane Visible na false. Na przykład następujący element będzie uczestniczyć w procesie kompilacji, ale nie będzie wyświetlany w Eksploratorze rozwiązań.

<ItemGroup>
    <IntermediateFile Include="cache.temp">
        <Visible>false</Visible>
    </IntermediateFile>
</ItemGroup>

Uwaga / Notatka

Metadane Visible są ignorowane przez Eksplorator rozwiązań dla projektów języka C++. Elementy będą zawsze wyświetlane, nawet jeśli Visible ustawiono wartość false.

Elementy zadeklarowane w plikach importowanych do projektu nie są domyślnie wyświetlane. Elementy utworzone podczas procesu kompilacji nigdy nie są wyświetlane w Eksploratorze rozwiązań.

Warunki dotyczące elementów i właściwości

Podczas kompilowania wszystkie warunki są w pełni respektowane.

Podczas określania wartości właściwości do wyświetlenia właściwości, które program Visual Studio uznaje za zależne od konfiguracji, są oceniane inaczej niż właściwości, które uznaje za niezależne od konfiguracji. W przypadku właściwości, które są zależne od konfiguracji, program Visual Studio odpowiednio ustawia właściwości Configuration i Platform, a następnie instruuje program MSBuild, aby ponownie ocenić projekt. Sposób oceniania warunków dla właściwości, które uznaje się za niezależne od konfiguracji, jest nieokreślony.

Wyrażenia warunkowe elementów są zawsze ignorowane na potrzeby decydowania, czy element powinien być wyświetlany w Eksploratorze rozwiązań.

Debugowanie

Aby znaleźć i uruchomić zestaw wyjściowy i dołączyć debuger, program Visual Studio potrzebuje właściwości OutputPath, AssemblyNamei OutputType poprawnie zdefiniowanych. Debuger nie może dołączyć, jeśli proces kompilacji nie spowodował wygenerowania pliku .pdb przez kompilator.

Wykonywanie celu w czasie projektowania

Program Visual Studio próbuje wykonać obiekty docelowe z określonymi nazwami podczas ładowania projektu. Te cele obejmują Compile, ResolveAssemblyReferences, ResolveCOMReferences, GetFrameworkPaths, i CopyRunEnvironmentFiles. Program Visual Studio uruchamia te obiekty docelowe, aby można było zainicjować kompilator w celu zapewnienia funkcji IntelliSense, można zainicjować debuger, a odwołania wyświetlane w Eksploratorze rozwiązań można rozwiązać. Jeśli te cele docelowe nie są obecne, projekt zostanie załadowany i skompilowany poprawnie, ale środowisko projektowania w programie Visual Studio nie będzie w pełni funkcjonalne.

Edytowanie plików projektu w programie Visual Studio

Aby bezpośrednio edytować projekt MSBuild, możesz otworzyć plik projektu w edytorze XML programu Visual Studio.

Aby odłączyć i edytować plik projektu w programie Visual Studio

  1. W Eksploratorze rozwiązań kliknij prawym przyciskiem myszy węzeł projektu, a następnie wybierz polecenie Zwolnij projekt.

    Projekt jest oznaczony (niedostępny).

  2. W Eksploratorze rozwiązań kliknij prawym przyciskiem myszy niedostępny węzeł projektu, a następnie wybierz polecenie Edytuj <plik> projektu.

    Plik projektu zostanie otwarty w edytorze XML programu Visual Studio.

  3. Edytuj, zapisz, a następnie zamknij plik projektu.

  4. W Eksploratorze rozwiązań kliknij prawym przyciskiem myszy niedostępny węzeł projektu, a następnie wybierz polecenie Załaduj ponownie projekt.

IntelliSense i walidacja

W przypadku edytowania plików projektu za pomocą edytora XML funkcja IntelliSense i walidacja są sterowane przez pliki schematu MSBuild. Są one instalowane w pamięci podręcznej schematów, które można znaleźć w <katalogu> instalacyjnym programu Visual Studio\Xml\Schemas\1033\MSBuild.

Podstawowe typy MSBuild są definiowane w pliku Microsoft.Build.Core.xsd i typowe typy używane przez program Visual Studio są definiowane w pliku Microsoft.Build.CommonTypes.xsd. Aby dostosować schematy tak, aby mieć funkcję IntelliSense i walidację dla niestandardowych nazw typów elementów, właściwości i zadań, można edytować plik Microsoft.Build.xsd lub utworzyć własny schemat zawierający schematy CommonTypes lub Core. Jeśli tworzysz własny schemat, musisz skierować edytor XML do odnalezienia go, używając okna Właściwości.

Edytowanie załadowanych plików projektu

Program Visual Studio buforuje zawartość plików projektu oraz plików importowanych przez te pliki projektu. Jeśli edytujesz załadowany plik projektu, program Visual Studio automatycznie wyświetli monit o ponowne załadowanie projektu, aby zmiany zaczęły obowiązywać. Jeśli jednak edytujesz plik zaimportowany przez załadowany projekt, nie będzie monitu o ponowne załadowanie i musisz zwolnić i ponownie załadować projekt ręcznie, aby zmiany zaczęły obowiązywać.

Grupy danych wyjściowych

Kilka obiektów docelowych zdefiniowanych w pliku Microsoft.Common.targets ma nazwy kończące się na OutputGroups lub OutputGroupDependencies. Program Visual Studio wywołuje te obiekty docelowe, aby uzyskać określone listy danych wyjściowych projektu. Na przykład obiekt docelowy SatelliteDllsProjectOutputGroup tworzy listę wszystkich zestawów satelickich, które utworzy kompilacja. Te grupy wyjściowe są używane przez funkcje, takie jak publikowanie, wdrażanie i odwołania z projektu do projektu. Projekty, które nie definiują ich, będą ładować i kompilować w programie Visual Studio, ale niektóre funkcje mogą nie działać poprawnie.

Rozpoznawanie odwołań

Rozwiązanie odwołania to proces używania elementów referencyjnych przechowywanych w pliku projektu w celu zlokalizowania rzeczywistych zestawów. Program Visual Studio musi uruchomić rozwiązywanie odwołań, aby wyświetlić szczegółowe właściwości dla każdego odwołania w oknie Właściwości. Na poniższej liście opisano trzy rodzaje odwołań i sposób ich rozwiązywania.

  • Odwołania do zestawów:

    System projektu wywołuje element docelowy o dobrze znanej nazwie ResolveAssemblyReferences. Ten element docelowy powinien generować elementy typu elementu o nazwie ReferencePath. Każdy z tych elementów powinien mieć specyfikację elementu (wartość Include atrybutu elementu) zawierającą pełną ścieżkę do odwołania. Elementy powinny zawierać wszystkie metadane pochodzące z elementów wejściowych, a także następujące nowe metadane:

    • CopyLocal, wskazując, czy zestaw powinien zostać skopiowany do folderu wyjściowego, ustawiony na wartość true lub false.

    • OriginalItemSpec, zawierający oryginalną specyfikację elementu odwołania.

    • ResolvedFrom, zostaje ustawiony na "{TargetFrameworkDirectory}", jeśli został rozpoznany z katalogu .NET Framework.

  • Odwołania COM:

    System projektu wywołuje element docelowy o dobrze znanej nazwie ResolveCOMReferences. Ten element docelowy powinien generować elementy o nazwie ComReferenceWrapperstypu elementu . Każdy z tych elementów powinien mieć specyfikację elementu zawierającą pełną ścieżkę do zestawu międzyoperacyjnego dla odwołania COM. Elementy powinny zawierać wszystkie metadane z elementów wejściowych przekazywanych, oprócz nowych metadanych o nazwie CopyLocal, wskazujących, czy zestaw powinien zostać skopiowany do folderu wyjściowego, ustawiony na wartość true lub false.

  • Odwołania natywne

    System projektu wywołuje element docelowy o dobrze znanej nazwie ResolveNativeReferences. Ten element docelowy powinien generować elementy o nazwie NativeReferenceFiletypu elementu . Elementy powinny zawierać wszystkie metadane z elementów wejściowych przeniesionych, a także nowy element metadanych o nazwie OriginalItemSpec, zawierający oryginalną specyfikację elementu odwołania.

Skróty wydajności

Jeśli używasz środowiska IDE programu Visual Studio do rozpoczęcia debugowania (wybierając F5 lub wybierając pozycję Debuguj>rozpocznij debugowanie na pasku menu) lub tworząc projekt (na przykład Kompiluj >rozwiązanie kompilacji), proces kompilacji używa szybkiego sprawdzania aktualizacji w celu zwiększenia wydajności. W niektórych przypadkach, w których dostosowane kompilacje tworzą pliki, które są tworzone z kolei, szybkie sprawdzanie aktualizacji nie identyfikuje poprawnie zmienionych plików. Projekty, które wymagają bardziej szczegółowych testów aktualizacji, mogą wyłączyć szybkie sprawdzanie, ustawiając zmienną środowiskową DISABLEFASTUPTODATECHECK=1. Alternatywnie projekty mogą ustawić tę wartość jako właściwość MSBuild w projekcie lub w pliku importowanym przez projekt.