はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【C#】MSBuildで環境変数によってDefineConstantsを用いてコードを切り替える方法

はじめに

今回はMSBuildで環境変数によってDefineConstantsを用いてコードを切り替える方法を紹介したいと思います。

概要

環境変数によってC#コードを変更したいこともあるかなと思います。

// 環境変数「HOGE_VERSION」が「1.0.0」以上の場合に「HOGE_1_0_0_OR_NEWER」を定義したい
#if HOGE_1_0_0_OR_NEWER
Console.WriteLine("v1.0.0以上のバージョンです。");
#else
Console.WriteLine("v1.0.0未満のバージョンです。");
#endif

MSBuildを使えば実現できるのですが、その方法を紹介したいと思います。

やり方

まず.csprojで環境変数を受け取るには$(HOGE_VERSION)で取得することができます。

<!-- HOGE_VERSIONが定義されていなければデフォルト値を利用するように定義する -->
<PropertyGroup>
    <HogeVersion Condition="'$(HOGE_VERSION)' != ''">$(HOGE_VERSION)</HogeVersion>
    <HogeVersion Condition="'$(HOGE_VERSION)' == ''">1.0.0</HogeVersion>
</PropertyGroup>

HOGE_1_0_0_OR_NEWERを定義するにはDefineConstantsを利用すればできるのですが、Conditionを利用して条件をつけます。

<!-- HogeVersionが1.0.0以上のときはHOGE_1_0_0_OR_NEWERを定義する。セマンティックバージョニングでの比較が可能です -->
<DefineConstants Condition=" '$(HogeVersion)' >= '1.0.0' ">HOGE_1_0_0_OR_NEWER</DefineConstants>

実験

#if HOGE_1_0_0_OR_NEWER
Console.WriteLine("v1.0.0以上のバージョンです。");
#else
Console.WriteLine("v1.0.0未満のバージョンです。");
#endif
<PropertyGroup>
    <!-- HOGE_VERSIONが定義されていなければデフォルト値を利用するように定義する -->
    <HogeVersion Condition="'$(HOGE_VERSION)' != ''">$(HOGE_VERSION)</HogeVersion>
    <HogeVersion Condition="'$(HOGE_VERSION)' == ''">1.0.0</HogeVersion>

    <!-- HogeVersionが1.0.0以上のときはHOGE_1_0_0_OR_NEWERを定義する。セマンティックバージョニングでの比較が可能です -->
    <DefineConstants Condition=" '$(HogeVersion)' >= '1.0.0' ">HOGE_1_0_0_OR_NEWER</DefineConstants>
</PropertyGroup>
# bash/zshではなくPowerShellです(PowerShell教なので)
> $env:HOGE_VERSION = "0.8.0"
> $env:HOGE_VERSION
0.8.0
> dotnet run
v1.0.0未満のバージョンです。
> $env:HOGE_VERSION = "1.8.0"
> $env:HOGE_VERSION
1.8.0
> dotnet run
v1.0.0以上のバージョンです。