Udostępnij za pośrednictwem


Wybieranie plików do kompilacji

W większości projektów nie trzeba specjalnie wybierać plików do skompilowania. Na przykład każdy projekt utworzony za pomocą programu Visual Studio kompiluje wszystkie pliki źródłowe w projekcie. Może jednak być konieczne poznanie sposobu edytowania pliku projektu w celu obsługi scenariuszy, które różnią się od domyślnego, na przykład w przypadku, gdy chcesz tworzyć pliki z innych lokalizacji spoza folderów projektu lub podczas tworzenia własnego procesu kompilacji zamiast używania zestawu SDK, takiego jak zestaw SDK platformy .NET.

Domyślne zachowanie według typu projektu

Domyślne zachowanie, które określa, jakie pliki MSBuild zawiera w kompilacji, różnią się w zależności od typu projektu.

W przypadku projektów zestawu .NET SDK standardowy zestaw .NET SDK definiuje domyślną Compile listę elementów zawierającą pliki w drzewie folderów projektu, które są zgodne z odpowiednim rozszerzeniem pliku specyficznym dla języka. Na przykład w przypadku projektu Compile w języku C# element jest wypełniany wzorcem **/*.csglob , który pasuje do wszystkich plików źródłowych w folderze projektu i wszystkich jego podfolderów cyklicznie. Nie widzisz Compile elementu w pliku projektu, ponieważ jest on zdefiniowany w pliku zestawu SDK .props , który jest importowany niejawnie. Zobacz Omówienie zestawu SDK projektu platformy .NET — domyślne dołączanie i wykluczanie.

Jeśli używasz programu Visual Studio, możesz zmodyfikować zestaw plików źródłowych do skompilowania, zmieniając akcję kompilacji w pliku. Ustaw go na wartość , aby None wykluczyć plik z kompilacji. Wykonanie tej czynności w programie Visual Studio wpływa na plik projektu. Zobaczysz, że wiersze zostały dodane, aby usunąć plik źródłowy z Compile listy elementów i dodać go do None listy elementów.

  <ItemGroup>
    <Compile Remove="Class.cs" />
  </ItemGroup>

  <ItemGroup>
    <None Include="Class.cs" />
  </ItemGroup>

W przypadku programu .NET Framework lub innych projektów Compile innych niż ZESTAW SDK element jest konstruowany jawnie w pliku projektu, wyświetlając listę wszystkich plików źródłowych.

W przypadku projektów C++ pliki źródłowe są jawnie dodawane do ClCompile elementu w pliku projektu.

Podczas ręcznego tworzenia pliku projektu MSBuild bez użycia zestawu SDK można wyświetlić listę każdego pliku źródłowego oddzielnie w pliku projektu lub użyć symboli wieloznacznych do uwzględnienia wszystkich plików w jednym katalogu lub zagnieżdżonego zestawu katalogów. Możesz również użyć technik w tym artykule, aby zmodyfikować Compile listę elementów (w projektach platformy .NET) lub ClCompile listę elementów w projektach języka C++, aby dostosować tworzone pliki.

Określanie danych wejściowych

Elementy reprezentują dane wejściowe (takie jak pliki źródłowe) kompilacji. Aby uzyskać więcej informacji na temat elementów, zobacz Elementy.

Aby dołączyć pliki do kompilacji, muszą one być uwzględnione na liście elementów. Jak wspomniano wcześniej, w projektach .NET SDK i .NET Framework lista elementów plików źródłowych to Compile. Lista elementów nie jest widoczna Compile w projektach zestawu .NET SDK, ponieważ jest ona zdefiniowana w niejawnych importach. Zobacz Korzystanie z zestawów SDK projektu.

Pliki projektu, które nie korzystają ze standardowych importów, mogą używać dowolnej nazwy listy elementów, takiej jak VBFile lub CSFile. Zobacz przykład 1 i przykład 2 w dalszej części tego artykułu. Aby skonfigurować kompilację na podstawie listy elementów, należy przekazać tę nazwę do zadania kompilacji zgodnie z opisem w dalszej części tego artykułu.

Wiele plików można dodać do list elementów, dołączając pliki pojedynczo lub używając symboli wieloznacznych do dołączania wielu plików jednocześnie.

Aby zadeklarować elementy indywidualnie

  • Include Użyj atrybutów podobnych do następujących:

    <Compile Include="Form1.cs"/>

    or

    <Compile Include="Form1.vb"/>

    Uwaga

    Jeśli elementy w kolekcji elementów nie znajdują się w tym samym katalogu co plik projektu, musisz określić pełną lub względną ścieżkę do elementu. Na przykład: Include="..\..\Form2.cs".

Tę samą listę elementów można wielokrotnie modyfikować za pomocą wielu Include atrybutów. Każdy Include dodaje do tego, co było wcześniej.

Aby zadeklarować wiele elementów

  • Include Użyj atrybutów podobnych do następujących:

    <Compile Include="Form1.cs;Form2.cs"/>

    lub

    <Compile Include="Form1.vb;Form2.vb"/>

Określanie danych wejściowych z symbolami wieloznacznymi

Można również używać symboli wieloznacznych, aby rekursywnie dołączać wszystkie pliki lub tylko określone pliki z podkatalogów jako dane wejściowe dla kompilacji. Aby uzyskać więcej informacji na temat symboli wieloznacznych, zobacz Elementy

Poniższe przykłady są oparte na projekcie zawierającym pliki graficzne w następujących katalogach i podkatalogach z plikiem projektu znajdującym się w katalogu project :

Project\Images\BestJpgs

Project\Images\ImgJpgs

Project\Images\ImgJpgs\Img1

Aby uwzględnić wszystkie pliki .jpg w katalogu Images i podkatalogach

  • Użyj następującego Include atrybutu:

    Include="Images\**\*.jpg"

Aby dołączyć wszystkie pliki .jpg począwszy od img

  • Użyj następującego Include atrybutu:

    Include="Images\**\img*.jpg"

Aby uwzględnić wszystkie pliki w katalogach z nazwami kończącymi się na jpg

  • Użyj jednego z następujących Include atrybutów:

    Include="Images\**\*jpgs\*.*"

    lub

    Include="Images\**\*jpgs\*"

Wykluczanie i usuwanie elementów

Możesz określić pliki pasujące do określonego wzorca z pewnymi wyjątkami. Można to zrobić w ramach jednej operacji z kombinacją elementów Include i Exclude.

<ItemGroup>
  <!-- Include every C# source file, except anything in the "sub" folder -->
  <Compile Include="**/*.cs" Exclude="sub/**/*.cs">
</ItemGroup>

Aby usunąć element, który został wcześniej dołączony lub został domyślnie dołączony do zestawu SDK, możesz użyć atrybutu Remove .

<ItemGroup>
  <!-- Remove anything in the "sub" folder -->
  <Compile Remove="sub/**/*.cs">
</ItemGroup>

Przekazywanie elementów do zadania lub miejsca docelowego

W większości plików projektu nie trzeba jawnie przekazywać Compile elementu do elementu docelowego lub zadania, ponieważ jest to obsługiwane przez standardowe importy. Jednak w przypadku docelowego pliku projektu można użyć @() notacji w zadaniach, aby określić całą listę elementów jako dane wejściowe kompilacji. Możesz użyć tej notacji niezależnie od tego, czy wyświetlasz listę wszystkich plików oddzielnie, czy też używasz symboli wieloznacznych.

Aby użyć wszystkich plików języka C# lub Visual Basic jako danych wejściowych do zadania kompilatora

  • Include Użyj atrybutów podobnych do następujących:

    <CSC Sources="@(CSFile)">...</CSC>

    or

    <VBC Sources="@(VBFile)">...</VBC>

Uwaga

Aby określić dane wejściowe dla kompilacji, należy użyć symboli wieloznacznych z elementami; Nie można określić danych wejściowych przy użyciu atrybutu Sources w zadaniach programu MSBuild, takich jak Csc lub Vbc. Poniższy przykład nie jest prawidłowy w pliku projektu:

<CSC Sources="*.cs">...</CSC>

Przykład 1

Poniższy przykład kodu przedstawia projekt, który zawiera oddzielnie wszystkie pliki wejściowe.

<Project DefaultTargets="Compile"
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >
    <PropertyGroup>
        <Builtdir>built</Builtdir>
    </PropertyGroup>

    <ItemGroup>
        <CSFile Include="Form1.cs"/>
        <CSFile Include="AssemblyInfo.cs"/>

        <Reference Include="System.dll"/>
        <Reference Include="System.Data.dll"/>
        <Reference Include="System.Drawing.dll"/>
        <Reference Include="System.Windows.Forms.dll"/>
        <Reference Include="System.XML.dll"/>
    </ItemGroup>

    <Target Name="PreBuild">
        <Exec Command="if not exist $(builtdir) md $(builtdir)"/>
    </Target>

    <Target Name="Compile" DependsOnTargets="PreBuild">
        <Csc Sources="@(CSFile)"
            References="@(Reference)"
            OutputAssembly="$(builtdir)\$(MSBuildProjectName).exe"
            TargetType="exe" />
    </Target>
</Project>

Przykład 2

Poniższy przykład kodu używa symbolu wieloznakowego do uwzględnienia wszystkich plików .cs .

<Project DefaultTargets="Compile"
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >

    <PropertyGroup>
        <builtdir>built</builtdir>
    </PropertyGroup>

    <ItemGroup>
        <CSFile Include="*.cs"/>

        <Reference Include="System.dll"/>
        <Reference Include="System.Data.dll"/>
        <Reference Include="System.Drawing.dll"/>
        <Reference Include="System.Windows.Forms.dll"/>
        <Reference Include="System.XML.dll"/>
    </ItemGroup>

    <Target Name="PreBuild">
        <Exec Command="if not exist $(builtdir) md $(builtdir)"/>
    </Target>

    <Target Name="Compile" DependsOnTargets="PreBuild">
        <Csc Sources="@(CSFile)"
            References="@(Reference)"
            OutputAssembly="$(builtdir)\$(MSBuildProjectName).exe"
            TargetType="exe" />
    </Target>
</Project>