Dela via


Välj de filer som ska skapas

I de flesta projekt behöver du inte specifikt välja de filer som ska skapas. Till exempel skapar alla projekt som skapats med Visual Studio alla källfiler i projektet. Du kan dock behöva veta hur du redigerar projektfilen för att hantera scenarier som skiljer sig från standardinställningen, till exempel när du vill skapa filer från andra platser utanför projektmapparna eller när du skapar en egen byggprocess i stället för att använda ett SDK som .NET SDK.

Standardbeteende efter projekttyp

Standardbeteendet som avgör vilka filer MSBuild innehåller i bygget skiljer sig beroende på projekttyp.

För .NET SDK-projekt definierar standard-.NET SDK en standardobjektlista Compile som innehåller filer i projektmappträdet som matchar lämpligt språkspecifikt filnamnstillägg. För ett C#-projekt Compile fylls objektet till exempel i med globmönstret **/*.cs, som matchar alla källfiler i projektmappen och alla dess undermappar rekursivt. Du ser inte elementet Compile i projektfilen eftersom det definieras i SDK-filen .props som importeras implicit. Se Översikt över .NET-projekt-SDK – standard inkluderar och exkluderar.

Om du använder Visual Studio kan du ändra uppsättningen med källfiler som ska skapas genom att ändra byggåtgärden för en fil. Ställ in den på None för att exkludera en fil från bygget. Att göra den här ändringen i Visual Studio påverkar projektfilen. Visual Studio lägger till rader för att ta bort källfilen från Compile objektlistan och lägga till den i None objektlistan.

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

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

För .NET Framework eller andra icke-SDK-projekt Compile skapas objektet explicit i projektfilen genom att alla källfiler visas.

För C++-projekt läggs källfiler uttryckligen till i elementet ClCompile i projektfilen.

När du handskapar en MSBuild-projektfil utan att använda en SDK kan du lista varje källfil separat i projektfilen, eller så kan du använda jokertecken för att inkludera alla filer i en katalog eller en kapslad uppsättning kataloger. Du kan också använda teknikerna i den här artikeln för att ändra Compile objektlistan (i .NET-projekt) eller ClCompile objektlistan i C++-projekt för att anpassa vilka filer som skapas.

Ange indata

Objekt representerar indata (till exempel källfiler) för en version. Mer information om objekt finns i Objekt.

Om du vill inkludera filer för en version måste de ingå i en objektlista. Som tidigare nämnts i .NET SDK- och .NET Framework-projekt är Compileobjektlistan för källfilerna . Du ser Compile inte objektlistan i .NET SDK-projekt eftersom den definieras i implicita importer. Se Använda projekt-SDK:er.

Projektfiler som inte förlitar sig på standardimporterna kan använda ett godtyckligt namn på objektlistan, till exempel VBFile eller CSFile. Se exempel 1 och exempel 2 senare i den här artikeln. Om du vill konfigurera ett bygge baserat på objektlistan skickar du objektlistan efter namn till en bygguppgift, enligt beskrivningen senare i den här artikeln.

Flera filer kan läggas till i objektlistor genom att antingen inkludera filerna individuellt eller med jokertecken för att inkludera många filer samtidigt.

Så här deklarerar du objekt individuellt

  • Använd attributen Include som liknar följande:

    <Compile Include="Form1.cs"/>

    eller

    <Compile Include="Form1.vb"/>

    Anmärkning

    Om objekt i en objektsamling inte finns i samma katalog som projektfilen måste du ange den fullständiga eller relativa sökvägen till objektet. Till exempel: Include="..\..\Form2.cs".

Samma objektlista kan ändras upprepade gånger av flera Include attribut. Varje Include bidrar till det som fanns där tidigare.

Deklarera flera objekt

  • Använd attributen Include som liknar följande:

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

    eller

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

Ange indata med jokertecken

Du kan också använda jokertecken för att rekursivt inkludera alla filer eller endast specifika filer från underkataloger som indata för en version. Mer information om jokertecken finns i Objekt

Följande exempel baseras på ett projekt som innehåller grafikfiler i följande kataloger och underkataloger, med projektfilen i project-katalogen :

Project\Images\BestJpgs

Project\Images\ImgJpgs

Project\Images\ImgJpgs\Img1

Inkludera alla .jpg filer i katalogen Images och underkataloger

  • Använd följande Include attribut:

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

Inkludera alla .jpg filer som börjar med img

  • Använd följande Include attribut:

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

Inkludera alla filer i kataloger med namn som slutar i jpgs

  • Använd något av följande Include attribut:

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

    eller

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

Exkluderande och borttagning av objekt

Du kanske vill ange filer som matchar ett visst mönster, med vissa undantag. Du kan göra det i en enda åtgärd med en kombination av Include och Exclude.

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

Om du vill ta bort ett objekt som tidigare ingick, eller som standard har inkluderats av en SDK, kan du använda attributet Remove .

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

Överför objekt till en uppgift eller ett mål

I de flesta projektfiler behöver du inte uttryckligen Compile skicka objektet till ett mål eller en uppgift, eftersom detta hanteras av standardimporterna. Men när det gäller en target i projektfilen kan du använda notationen @() i aktiviteter för att ange en hel objektlista som indata för en kompilering. Du kan använda den här notationen oavsett om du listar alla filer separat eller använder jokertecken.

Så här använder du alla C#- eller Visual Basic-filer som indata till en kompilatoruppgift

  • Använd attributen Include på ett sätt som liknar följande:

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

    eller

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

Anmärkning

Du måste använda jokertecken med objekt för att ange indata för en version. Du kan inte ange indata med hjälp av Sources attributet i MSBuild-uppgifter som Csc eller Vbc. Följande exempel är inte giltigt i en projektfil:

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

Exempel 1

I följande kodexempel visas ett projekt som innehåller alla indatafiler separat.

<Project DefaultTargets="Compile">
    <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>

Exempel 2

I följande kodexempel används ett jokertecken för att inkludera alla .cs filer.

<Project DefaultTargets="Compile">

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