MSBuildの使い方
Windowsには、標準でC#コンパイラ(csc.exe)があります。 なので、VisualStudio(VS)がなくても、C#によるコーディングができます。
ただ、リンクとかめんどくさく、できればもっと簡単にコーディングできるようにしたいです。
MSBuild.exeというも、Windows標準に入ってます。 これを使えばVSなしでビルドができます。
今回は、この使い方をまとめて行きたいと思います。
最終目標は、MSBuildを使ってDebugシンボルを使ったビルド切り替えができるところまでやります。
イメージとしては、MSBuildはC#特化のMakeみたいな感じです。
詳しくはGitHubにサンプルおいておいたので、そちらを確認ください。
TL;DR
- C:\Windows\Microsoft.NET\Framework\v4.0.30319にPathを通す(MSBuild.exe)
- 開発ディレクトリにHoge.csprojファイルを作成する
- 開発ディレクトリでMSBuild.exeを実行する
MSBuildとは
Microsoft Build Engine は、アプリケーションをビルドするためのプラットフォームです。 MSBuild とも呼ばれるこのエンジンには、ビルド プラットフォームでソフトウェアを処理およびビルドする方法を制御する、プロジェクト ファイル用の XML スキーマが用意されています。 Visual Studio は MSBuild を使用しますが、MSBuild は Visual Studio に依存しません。 プロジェクト ファイルまたはソリューション ファイルに対して msbuild.exe を実行すると、Visual Studio がインストールされていない環境で、製品の統合とビルドを実行できます。
https://docs.microsoft.com/ja-jp/visualstudio/msbuild/msbuild?view=vs-2017を読んでおけばおk。
VSなしでアプリケーションをビルドするプラットフォームです。
ソースを準備する
Hello, World
を表示する簡単なプログラム。
DEBUGシンボルを使って、ビルドを切り替えてます。
using System; namespace Program1 { class Program { static void Main(string[] args) { #if DEBUG Console.WriteLine("Hello, DEBUG!"); #else Console.WriteLine("Hello, world!"); #endif } } }
MSBuildにPathを通す。
パスは以下。
C:\Windows\Microsoft.NET\Framework\v4.0.30319
Framework
とv4.0.30319
はお好みに合わせて変更します。
ちなみに、上記Pathにcsc.exe(C#コンパイラ)もいます。
hoge.csprojを作成する。
hoge.csprojファイルでビルドの詳細を設定します。
VSで、プロジェクト > プロパティ で設定できる項目は、大体設定できる印象。
注意点は以下。
ToolVersionは4.0
ToolVersionを4.0と書かないと、WinForm系のビルドができなかった気がする。
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.CSharp.targetsは安牌
上記ファイルを読み込んでおけば、コンパイラの設定をしなくてもDebugシンボルが使えるようになる。
使nい場合は、csprojファイル内に<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
と書きます。
安牌を使わない場合
PropertyGroup
で、Debug/Release時の設定をそれぞれを行います。
その後、Target要素の中に、CSC要素を追加します。
CSC要素の属性値DefineConstants
でDebug/Releaseを指定します。
<PropertyGroup> <AssemblyName>helloworld</AssemblyName> </PropertyGroup> <!-- Releas以外はすべてDebugとする --> <PropertyGroup> <OutputPath>bin\Debug\</OutputPath> <DebugSymbols>true</DebugSymbols> <DefineConstants>DEBUG;TRACE</DefineConstants> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)' == 'Release'"> <OutputPath>bin\Release\</OutputPath> <DefineConstants>TRACE</DefineConstants> </PropertyGroup> <ItemGroup> <Compile Include="*.cs" /> </ItemGroup> <Target Name="Build" Inputs="@(Compile)" Outputs="$(OutputPath)$(AssemblyName).exe" > <Message text="DefineConstants: $(DefineConstants)" /> <Message text="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <MakeDir Directories="$(OutputPath)" Condition="!Exists('$(OutputPath)')" /> <Message text="Create: $(OutputPath)$(AssemblyName).exe" /> <Csc Sources="@(Compile)" OutputAssembly="$(OutputPath)$(AssemblyName).exe" DefineConstants="$(DefineConstants)" /> </Target>
ビルドする
-t
がターゲット指定、-p
がプロパティ指定をする、それぞれのオプションです。
上記のようにcsprojファイルが記述されている前提ですが、Debugビルドをする場合は、-p
オプションで指定します。
$ msbuild -t:build -p:Configuration=Debug
終わりに
プロジェクトによっては、自由にアプリケーションや実行環境を導入できない場合があります。 (というか、それがだいたいです)
Windowsだったら、それでもC#が使えるので、代替品を自作することができます。
(Linuxならもっと自由ですが)
C#で自作ツールを作成し、貧弱なWindows環境でもちょびっとだけ業務効率を上げることが出そうです。
これで、QOLがちょびっとだけ上がった。