75

私は盲目かもしれませんが、MSBUILD で条件付きコンパイル シンボルを指定するコマンド ラインはありますか?

現在、ビルドスクリプトに次の行があります。

SET MSBUILD=C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe
SET CONFIG=Debug
%MSBUILD% /p:Configuration=%CONFIG% /p:OutputPath=..\..\output source\MyProject\MyProject.csproj

そして、条件を追加したいと思います。Visual Studio では、[プロジェクト プロパティ] => [ビルド] => [条件付きコンパイル シンボル] に移動できますが、msbuild のオプションは見たことがありませんか?

ボーナス カルマは、.csproj ファイルで既に指定されているすべてのシンボルを完全にオーバーライドして、Buildscript からの条件のみが含まれるようにすることができるかどうかを知っている場合に役立ちます。

4

4 に答える 4

141

これを見たことがありますか?(ほとんどの情報は最後から2番目の投稿にあります)

/p:DefineConstants="MYSYMBOL1;MYSYMBOL2"
于 2009-01-26T15:40:39.300 に答える
19

Björn Lasar によるこの投稿では、セミコロンの代わりにスペースを使用する必要がありました

更新: ブログは消えました。 インターネット アーカイブ経由で取得:

最近、いくつかのビルドを自動化するために、MSBuild を直接使用する必要がありました。また、構成に基づいていくつかのプリプロセッサ定義を構成する必要がありました。これは通常、このような Argument によって行われます

"/p:DefineConstants=MY_PREPROC_FLAG"

それについてはウェブ上に十分なコメントがあるので、ここでは特別なことはありません。今日、もう 1 つのフラグが必要だったので、IDE から知っていたのと同様のコマンドライン構文を使用しました。

"/p:DefineConstants=MY_PREPROC_FLAG;YET_ANOTHER_FLAG"

しかし、これはうまくいきませんでした。

つまり、コマンドラインでプロジェクトに複数の定義をサポートしたい場合は、それらを単純なスペースで区切る必要があるということです...

"/p:DefineConstants=MY_PREPROC_FLAG YET_ANOTHER_FLAG" 

IDE から (セミコロンで区切られた) 定義に追加されます。わかってよかった…と思います。

于 2009-11-26T17:17:47.403 に答える
5

/p:DefineConstantsオール オア ナッシングの取引です。

トレース シンボルをオフにしたいだけの場合は、次の方法ではできません。msbuild /p:DefineTrace=false

すでに定義されているすべてのシンボルをオーバーライドするには、何かを定義する必要があります。msbuild /p:DefineConstants="RANDOM-SYMBOL"

Michael Stum に感謝します。この隠されたルールを指摘してくれました 。それについてのブログも書いています --- リンク切れ

于 2011-11-11T11:15:29.083 に答える
1

回答で述べられていることは、C#コードだけでなく、ASP.NET の "codebehind" C# コードにも有効です。ASP.NET Web プロジェクトの場合、ASPX ページでも条件付きコンパイルを行いたい場合は、条件付きで HTML をページにレンダリングするのとは少し異なる動作をします (MasterPageFile="..." AutoEventWireup="true" CodeBehind="..." Inherits="..."通常、<%@ ... %>宣言にあるものも削除したことに注意してください)。

<%@ Page Title="MyPage" Language="C#" CompilerOptions="/d:DebugSym1;DebugSym2" %>

<% #if DebugSym1 %>         
    <h4>Section1</h4>
<% #else %>
    <h4>(Section 1 skipped)</h4>
<% #endif %>

<% #if DebugSym2 %>         
    <h4>Section2</h4>
<% #else %>
    <h4>(Section 2 skipped)</h4>
<% #endif %>

からDebugSym1またはを削除すると、関連するステートメントの一部がレンダリングされます。DebugSym2CompilerOptions#else#if

これは、このトピックを完全なものにするために言及する価値があり、時間を節約できると思いました. 興味があれば、この記事でさらに詳しく知ることができます。

于 2013-06-17T12:02:27.833 に答える