次の方法で共有


MSBuild プロジェクト ファイルを最初から作成する

.NET Framework を対象とするプログラミング言語では、MSBuild プロジェクト ファイルを使用して、アプリケーションのビルド プロセスを記述および制御します。 Visual Studio を使用して MSBuild プロジェクト ファイルを作成すると、適切な XML がファイルに自動的に追加されます。 ただし、XML の編成方法と、XML を変更してビルドを制御する方法を理解すると役立つ場合があります。

手記

この記事は、MSBuild の動作に関する基本的な基礎を任意の SDK とは別に学習する場合に適しています。 dotnet build を使用する場合やルート プロジェクト要素に Sdk 属性を追加する場合など、SDK を使用したビルドについては、この記事では説明しません。 .NET プロジェクト SDK を参照してください。

標準の .csproj ファイルによってインポートされるビルド ロジックでは、この例よりもはるかに多くのオプションと複雑なビルド プロセスがサポートされています。

C++ プロジェクトのプロジェクト ファイルの作成の詳細については、「MSBuild (C++)を参照してください。

このチュートリアルでは、テキスト エディターのみを使用して、基本的なプロジェクト ファイルを段階的に作成する方法について説明します。 このチュートリアルでは、次の手順に従います。

  1. PATH 環境変数を拡張します。

  2. 最小限のアプリケーション ソース ファイルを作成します。

  3. 最小の MSBuild プロジェクト ファイルを作成します。

  4. プロジェクト ファイルを使用してアプリケーションをビルドします。

  5. ビルドを制御するプロパティを追加します。

  6. プロパティ値を変更してビルドを制御します。

  7. ビルドにターゲットを追加します。

  8. ターゲットを指定してビルドを制御します。

  9. 段階的にビルドします。

このチュートリアルでは、コマンド プロンプトでプロジェクトをビルドし、結果を確認する方法について説明します。 MSBuild の詳細と、コマンド プロンプトで MSBuild を実行する方法については、「MSBuild を使用するを参照してください。

チュートリアルを完了するには、チュートリアルに必要な MSBuild と C# コンパイラが含まれているため、Visual Studio がインストールされている必要があります。

パスを拡張する

MSBuild を使用する前に、PATH 環境変数を拡張して、必要なすべてのツールを含める必要があります。

Windows で実行している場合は、Visual Studio 用の開発者コマンド プロンプトを使用できます。 Windows タスク バーの Windows 検索ボックスで検索します。 通常のコマンド プロンプトまたはスクリプト環境で環境を設定するには、Visual Studio インストールの Common7/Tools サブフォルダーで VSDevCmd.bat を実行します。

最小限のアプリケーションを作成する

このセクションでは、テキスト エディターを使用して最小限の C# アプリケーション ソース ファイルを作成する方法について説明します。

  1. コマンド プロンプトで、アプリケーションを作成したいフォルダーに移動します。たとえば、\My Documents\\Desktop\です。

  2. \HelloWorld\ という名前のサブフォルダーを作成し、その中に移動するようにディレクトリを変更します。

  3. テキスト エディターで、新しいファイル HelloWorld.cs を作成し、次のコードをコピーして貼り付けます。

    using System;
    
    class HelloWorld
    {
        static void Main()
        {
    #if DebugConfig
            Console.WriteLine("WE ARE IN THE DEBUG CONFIGURATION");
    #endif
    
            Console.WriteLine("Hello, world!");
        }
    }
    
  4. コマンド プロンプトで「csc helloworld.cs 入力して、アプリケーションをビルドします。

  5. コマンド プロンプトで「helloworld 入力して、アプリケーションをテストします。

    こんにちは、世界! メッセージが表示されます。

  6. 実行可能ファイルを削除します。

最小限の MSBuild プロジェクト ファイルを作成する

最小限のアプリケーション ソース ファイルが作成されたので、最小限のプロジェクト ファイルを作成してアプリケーションをビルドできます。 このプロジェクト ファイルには、次の要素が含まれています。

  • 必要なルート Project ノード。

  • 項目要素を格納する ItemGroup ノード。

  • アプリケーション ソース ファイルを参照する項目要素。

  • アプリケーションのビルドに必要なタスクを格納する Target ノード。

  • C# コンパイラを起動してアプリケーションをビルドするための Task 要素。

最小 MSBuild プロジェクト ファイルを作成するには

  1. テキスト エディターで、HelloWorld.fromscratchproj 新しいファイルを作成し、次のコードを入力します。

    <Project>
      <ItemGroup>
        <Compile Include="helloworld.cs" />
      </ItemGroup>
    </Project>
    

    この ItemGroup には、Compile 項目要素が含まれており、1 つのソース ファイルを項目として指定します。

  2. Target ノードを Project ノードの子要素として追加します。 ノードに Build名前を付けます。

    <Target Name="Build">
    </Target>
    
  3. このタスク要素を、Target ノードの子要素として挿入します。

    <Csc Sources="@(Compile)"/>
    
  4. このプロジェクト ファイルを保存し、Helloworld.fromscratchproj 名前を付けます。

最小限のプロジェクト ファイルは、次のコードのようになります。

<Project>
  <ItemGroup>
    <Compile Include="helloworld.cs"/>
  </ItemGroup>
  <Target Name="Build">
    <Csc Sources="@(Compile)"/>
  </Target>
</Project>

ビルド ターゲット内のタスクは順番に実行されます。 この場合、C# コンパイラ Csc タスクのみがタスクです。 コンパイルするソース ファイルの一覧が必要であり、これは Compile 項目の値によって指定されます。 Compile 項目は、Helloworld.cs1 つのソース ファイルのみを参照します。

手記

item 要素では、次のようにアスタリスクワイルドカード文字 (*) を使用して、.cs ファイル名拡張子を持つすべてのファイルを参照できます。

<Compile Include="*.cs" />

アプリケーションをビルドする

ここで、アプリケーションをビルドするには、先ほど作成したプロジェクト ファイルを使用します。

  1. コマンド プロンプトで、「msbuild helloworld.fromscratchproj -t:Build」と入力します。

    これにより、C# コンパイラを呼び出して Helloworld アプリケーションを作成することで、Helloworld プロジェクト ファイルのビルド ターゲットがビルドされます。

  2. helloworld 入力して、アプリケーションをテストします。

    こんにちは、世界! メッセージが表示されます。

手記

詳細レベルを上げると、ビルドの詳細情報を表示できます。 詳細度を「詳細」に設定するには、コマンド プロンプトで次のコマンドを入力します。

msbuild helloworld.fromscratchproj -t:Build -verbosity:detailed

ビルド プロパティを追加する

プロジェクト ファイルにビルド プロパティを追加して、ビルドをさらに制御できます。 次に、次のプロパティを追加します。

  • アプリケーションの名前を指定する AssemblyName プロパティ。

  • アプリケーションを格納するフォルダーを指定する OutputPath プロパティ。

ビルド プロパティを追加するには

  1. 既存のアプリケーション実行可能ファイルを削除します (後で、古い出力ファイルの削除を処理する Clean ターゲットを追加します)。

  2. プロジェクト ファイルで、次の PropertyGroup 要素をProject 要素の開始直後に配置します。

    <PropertyGroup>
      <AssemblyName>MSBuildSample</AssemblyName>
      <OutputPath>Bin\</OutputPath>
    </PropertyGroup>
    
  3. Csc タスクの直前に、このタスクをビルド ターゲットに追加します。

    <MakeDir Directories="$(OutputPath)" Condition="!Exists('$(OutputPath)')" />
    

    MakeDir タスクでは、現在その名前のフォルダーが存在しない場合に、OutputPath プロパティによって名前が付けられたフォルダーが作成されます。

  4. この OutputAssembly 属性を Csc タスクに追加します。

    <Csc Sources="@(Compile)" OutputAssembly="$(OutputPath)$(AssemblyName).exe" />
    

    これにより、C# コンパイラは、AssemblyName プロパティによって名前付けされたアセンブリを生成し、OutputPath プロパティによって名前付けされたフォルダーに配置するように指示します。

  5. 変更を保存します。

これで、プロジェクト ファイルは次のコードのようになります。

<Project>
  <PropertyGroup>
    <AssemblyName>MSBuildSample</AssemblyName>
    <OutputPath>Bin\</OutputPath>
  </PropertyGroup>
  <ItemGroup>
    <Compile Include="helloworld.cs" />
  </ItemGroup>
  <Target Name="Build">
    <MakeDir Directories="$(OutputPath)" Condition="!Exists('$(OutputPath)')" />
    <Csc Sources="@(Compile)" OutputAssembly="$(OutputPath)$(AssemblyName).exe" />
  </Target>
</Project>

手記

Csc タスクの OutputAssembly 属性に追加するのではなく、OutputPath 要素で指定するときに、フォルダー名の末尾に円記号 (\) パス区切り記号を追加することをお勧めします。 そこで

<OutputPath>Bin\</OutputPath>

OutputAssembly="$(OutputPath)$(AssemblyName).exe" />

この形式が次の形式より推奨されます。

<OutputPath>Bin</OutputPath>

OutputAssembly="$(OutputPath)\$(AssemblyName).exe" />

ビルドのプロパティをテストする

これで、ビルド プロパティを使用して出力フォルダーとアプリケーション名を指定したプロジェクト ファイルを使用して、アプリケーションをビルドできます。

  1. コマンド プロンプトで、「msbuild helloworld.fromscratchproj -t:Build」と入力します。

    これにより、\Bin\ フォルダーが作成され、C# コンパイラが呼び出され、MSBuildSample アプリケーションが作成され、\Bin\ フォルダーに格納されます。

  2. \Bin\ フォルダーが作成されていること、および MSBuildSample アプリケーションが含まれていることを確認するには、「dir Bin 入力します。

  3. Bin\MSBuildSample 入力して実行可能ファイルを実行して、アプリケーションをテストします。

    こんにちは、世界! メッセージが表示されます。

ビルド ターゲットを追加する

次に、次のように、さらに 2 つのターゲットをプロジェクト ファイルに追加します。

  • 古いファイルを削除するクリーン ターゲット。

  • DependsOnTargets 属性を使用して、ビルド タスクの前に Clean タスクを強制的に実行する再構築ターゲット。

複数のターゲットが作成されたので、ビルド ターゲットを既定のターゲットとして設定できます。

ビルド ターゲットを追加するには

  1. プロジェクト ファイルで、ビルド ターゲットの直後に次の 2 つのターゲットを追加します。

    <Target Name="Clean" >
      <Delete Files="$(OutputPath)$(AssemblyName).exe" />
    </Target>
    <Target Name="Rebuild" DependsOnTargets="Clean;Build" />
    

    Clean ターゲットは、Delete タスクを呼び出してアプリケーションを削除します。 再構築ターゲットは、Clean ターゲットとビルド ターゲットの両方が実行されるまで実行されません。 リビルド ターゲットにはタスクはありませんが、ビルド ターゲットの前に Clean ターゲットが実行されます。

  2. DefaultTargets 属性を Project 要素の開始に追加してください。

    <Project DefaultTargets="Build">
    

    これにより、ビルド ターゲットが既定のターゲットとして設定されます。

これで、プロジェクト ファイルは次のコードのようになります。

<Project DefaultTargets="Build">
  <PropertyGroup>
    <AssemblyName>MSBuildSample</AssemblyName>
    <OutputPath>Bin\</OutputPath>
  </PropertyGroup>
  <ItemGroup>
    <Compile Include="helloworld.cs" />
  </ItemGroup>
  <Target Name="Build">
    <MakeDir Directories="$(OutputPath)" Condition="!Exists('$(OutputPath)')" />
    <Csc Sources="@(Compile)" OutputAssembly="$(OutputPath)$(AssemblyName).exe" />
  </Target>
  <Target Name="Clean" >
    <Delete Files="$(OutputPath)$(AssemblyName).exe" />
  </Target>
  <Target Name="Rebuild" DependsOnTargets="Clean;Build" />
</Project>

ビルド ターゲットをテストする

新しいビルド ターゲットを実行して、プロジェクト ファイルのこれらの機能をテストできます。

  • 既定のビルドをビルドします。

  • コマンド プロンプトでアプリケーション名を設定します。

  • 別のアプリケーションがビルドされる前にアプリケーションを削除する。

  • 別のアプリケーションをビルドせずにアプリケーションを削除する。

ビルド ターゲットをテストするには

  1. コマンド プロンプトで、「msbuild helloworld.fromscratchproj -p:AssemblyName=Greetings」と入力します。

    -t スイッチを使用してターゲットを明示的に設定しなかったため、MSBuild は既定のビルド ターゲットを実行します。 -p スイッチは、AssemblyName プロパティをオーバーライドし、Greetings新しい値を指定します。 これにより、\Bin\ フォルダーに新しいアプリケーション Greetings.exeが作成されます。

  2. \Bin\ フォルダーに、MSBuildSample アプリケーションと新しい Greetings アプリケーションの両方が含まれていることを確認するには、「dir Bin 入力します。

  3. Greetings アプリケーションをテストします (たとえば、Windows で「Bin\Greetings 」と入力します)。

    こんにちは、世界! メッセージが表示されます。

  4. msbuild helloworld.fromscratchproj -t:clean 入力して、MSBuildSample アプリケーションを削除します。

    これにより、Clean タスクが実行され、既定の AssemblyName プロパティ値 (MSBuildSample) を持つアプリケーションが削除されます。

  5. msbuild helloworld.fromscratchproj -t:clean -p:AssemblyName=Greetings 入力して Greetings アプリケーションを削除します。

    これにより、Clean タスクが実行され、指定された AssemblyName プロパティ値を持つアプリケーション Greetings削除されます。

  6. \Bin\ フォルダーが空であることを確認するには、「dir Bin 入力します。

  7. msbuild」と入力します。

    プロジェクト ファイルが指定されていませんが、現在のフォルダーにはプロジェクト ファイルが 1 つしかないため、MSBuild は helloworld.fromscratchproj ファイル ビルドします。 これにより、MSBuildSample アプリケーションが \Bin\ フォルダーに作成されます。

    \Bin\ フォルダーに MSBuildSample アプリケーションが含まれていることを確認するには、「dir Bin 入力します。

徐々にビルドする

ターゲットが依存しているソース ファイルまたはターゲット ファイルが変更された場合にのみ、ターゲットをビルドするように MSBuild に指示できます。 MSBuild では、ファイルのタイム スタンプを使用して、ファイルが変更されたかどうかを判断します。

インクリメンタル ビルドを実行するには

  1. プロジェクト ファイルで、開いているビルド ターゲットに次の属性を追加します。

    Inputs="@(Compile)" Outputs="$(OutputPath)$(AssemblyName).exe"
    

    これは、ビルド ターゲットが、Compile 項目グループで指定されている入力ファイルに依存し、出力ターゲットがアプリケーション ファイルであることを指定します。

    結果のビルド ターゲットは、次のコードのようになります。

    <Target Name="Build" Inputs="@(Compile)" Outputs="$(OutputPath)$(AssemblyName).exe">
      <MakeDir Directories="$(OutputPath)" Condition="!Exists('$(OutputPath)')" />
      <Csc Sources="@(Compile)" OutputAssembly="$(OutputPath)$(AssemblyName).exe" />
    </Target>
    
  2. コマンド プロンプトで「msbuild -v:d 入力して、ビルド ターゲットをテストします。

    helloworld.fromscratchproj が既定のプロジェクト ファイルであり、Build が既定のターゲットであることを覚えておいてください。

    -v:d スイッチは、前に使用した -verbosity:detailed の省略形です。

    出力を既にビルドしている場合は、次の行が表示されます。

    すべての出力ファイルが入力ファイルに対して最新なので、ターゲット "Build" を省略します。

    アプリケーションが最後にビルドされてからソース ファイルが変更されていないため、MSBuild はビルド ターゲットをスキップします。

C# の例

次の例は、C# アプリケーションをコンパイルし、出力ファイル名を含むメッセージをログに記録するプロジェクト ファイルを示しています。

コード

<Project DefaultTargets = "Compile">

    <!-- Set the application name as a property -->
    <PropertyGroup>
        <appname>HelloWorldCS</appname>
    </PropertyGroup>

    <!-- Specify the inputs by type and file name -->
    <ItemGroup>
        <CSFile Include = "*.cs"/>
    </ItemGroup>

    <Target Name="Compile">
        <!-- Run the C# compilation using input files of type CSFile -->
        <CSC
            Sources = "@(CSFile)"
            OutputAssembly = "$(appname).exe">
            <!-- Set the OutputAssembly attribute of the CSC task
            to the name of the executable file that is created -->
            <Output
                TaskParameter = "OutputAssembly"
                ItemName = "EXEFile" />
        </CSC>
        <!-- Log the file name of the output file -->
        <Message Text="The output file is @(EXEFile)"/>
    </Target>
</Project>

Visual Basic の例

次の例は、Visual Basic アプリケーションをコンパイルし、出力ファイル名を含むメッセージをログに記録するプロジェクト ファイルを示しています。

コード

<Project DefaultTargets = "Compile">

    <!-- Set the application name as a property -->
    <PropertyGroup>
        <appname>HelloWorldVB</appname>
    </PropertyGroup>

    <!-- Specify the inputs by type and file name -->
    <ItemGroup>
        <VBFile Include = "consolehwvb1.vb"/>
    </ItemGroup>

    <Target Name = "Compile">
        <!-- Run the Visual Basic compilation using input files of type VBFile -->
        <VBC
            Sources = "@(VBFile)"
            OutputAssembly= "$(appname).exe">
            <!-- Set the OutputAssembly attribute of the VBC task
            to the name of the executable file that is created -->
            <Output
                TaskParameter = "OutputAssembly"
                ItemName = "EXEFile" />
        </VBC>
        <!-- Log the file name of the output file -->
        <Message Text="The output file is @(EXEFile)"/>
    </Target>
</Project>

次は何ですか?

Visual Studio は、このチュートリアルに示されている作業の多くを自動的に実行できます。 Visual Studio を使用して MSBuild プロジェクト ファイルを作成、編集、ビルド、テストする方法については、「msBuild を使用するを参照してください。