質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.63%

VisualStudio2013 複数プロジェクトでのコンパイルスイッチ

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 186

TEC_S

score 43

前提・実現したいこと

Visual Studio2013で、ソースコード管理について、ご相談です。
リリースをビルドする際、事情があり、有効にしたくない(客先事情)ソースコードがあるプロジェクトにて、下記条件で効率的に管理をするにはどういう方法があるのか、ご教授願いたく、投稿しました。

・ソースコードベースで管理したい(該当ソースコードのようなイメージ)
・Gitなどは使わない

[追記]
構成を理解していませんでした。申し訳ありません。
ソリューションの中に、複数プロジェクトがあり、1つのソリューションを一括で管理したいと考えています。そのような方法、ないでしょうか。。。

発生している問題

可能であれば、VB.NETのコンパイルスイッチのような、一発で切替できる管理をしたい(現状、調べた限りでは、そういう機能がない??)

該当のソースコード

例えば、今であれば、#if / #end if でソースを管理しています。(管理といっていいのか・・・)
また、通常はGitなどを使ってはいるのですが・・・
今回は、ソースコード上での切替が出来るのがベストだという事を言われています。。。(個人的には、Gitでの差分確認で良いと思うのですが・・・それはNG)

#if true // Ver.〇〇より追加/変更
  ・
  ・
  ソースコード
  ・
  ・
#else //変更時はこれ以降に以前のコード(追加時はない)
  ・
  ・
#endif


これだと、一つ一つ確認していく必要があるので、漏れが出る可能性が高く(管理しにくく)問題だと考えています。

調査した内容

1) #defineを使用する
コンパイラオプションを設定して、有効/無効のソースコードを分ける
参考:https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/compiler-options/define-compiler-option

→ 自分の理解では、ソースファイル一つずつに宣言をしないといけないので、現実的ではない?

#define No_Relese
Using System;
 ・
 ・
 ・

namespace 〇〇
{
 ・
 ・
 ・

}

2)条件付きコンパイル
https://dobon.net/vb/dotnet/programing/define.html

→ まさにこれだっと思ったのですが、構成プロパティ―になぜか「ビルド」が表示されていない。
VisualStudioのオプション → プロジェクトおよびソリューション → 全般 → 「ビルド構成の詳細を表示(I)」のチェックが入っていることを確認。
イメージ説明

プロジェクトのプロパティ(複数のプロジェクトが1つのソリューションにある)
イメージ説明

この使い方は、#defineの使い方と同様の使い方しか出来なそう...

補足情報(FW/ツールのバージョンなど)

OS:Windows10
開発環境:Visual Studio2013 / .NetFramwork4.6

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • alg

    2020/02/13 19:36

    .NET Framework のバージョンはいくつでしょうか?

    キャンセル

  • dodox86

    2020/02/13 19:48

    > まさにこれだっと思ったのですが、構成プロパティ―になぜか「ビルド」が表示されていない。
    「ソリューション」のプロパティを見ているのだと思います。「プロジェクト」のプロパティで確認してください。

    キャンセル

  • TEC_S

    2020/02/13 22:17

    ご指摘、ありがとうございます。
    分かる範囲・・・修正しました。
    プロジェクトのプロパティ、、やはり見ている所が違いますか??

    キャンセル

回答 3

checkベストアンサー

+1

プロジェクトでビルド時に指定するシンボル(#defineで指定するもの)は、プロジェクトファイル*.csproj 内でDefineConstants要素で指定されています。ビルドの前に、各プロジェクトの *.csprojファイルのこの要素部分を、何らかのスクリプト(バッチファイルでも、PowerShellスクリプトでも何でも)で書き換えた後、ビルドすることで一応は用を成すことができます。

  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
...
    <DefineConstants>TRACE;DEBUG;<追加したいシンボル></DefineConstants>
...
  </PropertyGroup>

ただ、プロジェクトの「ビルドイベント」、「ビルド前イベントのコマンドライン」でこれができれば良いですが、ビルド時は*.csprojファイルが使用中である為、難しいでしょう。ビルドする前にあらかじめ実行しておく必要があるかと思います。

で、#defineで指定するシンボルを、外部で定義できると目的を果たせそうです。

Visual Studioの「開発者コマンドプロンプト」上では、ご存じのようにdevenvコマンドでビルドすることができます。ここで、環境変数を指定してみます。

方法: ビルドで環境変数を使用する - Visual Studio 2015
※Visual Studio 2015に関する記事ですが、お使いのVisual Studio 2013ならほぼ同じはずです。

例えば上記、*.csprojファイルの<PropertyGroup><DefineConstants>相当の部分に$(EXTRA_VARS)と入力します。(EXTRA_VARSと言うのは便宜上の名前です。適当に変えてください)

イメージ説明

Visual Studioの「開発者コマンドプロンプト」上で、環境変数EXTRA_VARSの値にシンボルとしてDEFVAR1DEFVAR3;で区切って指定します。確認の為、あえてDEFVAR2を除外しておきます。

C:\work>set EXTRA_VARS=DEFVAR1;DEFVAR3

C:\work>echo %EXTRA_VARS%
DEFVAR1;DEFVAR3

DEFVAR1DEFVAR2DEFVAR3のシンボルを利用する以下のコードを例として

using System;

namespace ConApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("*** start.");
#if DEFVAR1
#warning "DEFVAR1 defined."
            Console.WriteLine("--- DEFVAR1");
#endif

#if DEFVAR2
#warning "DEFVAR2 defined."
            Console.WriteLine("--- DEFVAR2");
#endif

#if DEFVAR3
#warning "DEFVAR3 defined."
            Console.WriteLine("--- DEFVAR3");
#endif
            Console.WriteLine("*** done.");
        }
    }
}

devenvコマンドでソリューションファイル ConApp1.slnを指定し、rebuildします。

C:\work>devenv /rebuild debug ConApp1.sln

Microsoft (R) Microsoft Visual Studio 2012 Version 11.0.61219.0.
Copyright (C) Microsoft Corp. All rights reserved.
1>------ すべてのリビルド開始: プロジェクト: ConApp1, 構成: Debug Any CPU ------
1>C:\work\Program.cs(11,10,11,28): warning CS1030: #warning: '"DEFVAR1 defined."'
1>C:\work\Program.cs(21,10,21,28): warning CS1030: #warning: '"DEFVAR3 defined."'
1>  ConApp1 -> C:\work\bin\Debug\ConApp1.exe
========== すべてリビルド: 1 正常終了、0 失敗、0 スキップ ==========


コード中に記述した#warningプリプロセッサ命令がビルド中に実行されていることが分かります。

ビルドした実行ファイルを実際に実行してみます。DEFVAR2部分が無いことが分かります。

C:\work>bin\Debug\ConApp1.exe
*** start.
--- DEFVAR1
--- DEFVAR3
*** done.

C:\work>

この方法ならば、各プロジェクトで共通の環境変数の値を利用してコンパイル時の条件を制御できるでしょう。(尚、上記実行例は、Visual Studio 2012で確認したものです)

Visual Studio でのビルド時に使われる「MSBuild」に関する情報を踏まえておくと、より高度なことができると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/02/14 15:15

    ありがとうございます。
    頂いた情報で、実現できました!!

    キャンセル

0

dodox86さんも指摘されていますが、
ソリューションエクスプローラー>プロジェクト>右クリック>プロパティ>ビルド>条件付きコンパイルシンボル
で指定できます。

下の画面はVisualStuido2019ですが、だいたい同じだと思います。
イメージ説明

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/02/13 23:20

    ありがとうございます。
    条件つきコンパイルシンボルを見つけれました。
    しかし、自分の当初やりたい内容が的確に分かっておらず・・・条件つきコンパイルシンボルをしているすだけでは、自分の意図(複数プロジェクトがあるソリューション全てを一つのコンパイルスイッチで管理したい)を可能とするものではありませんでした。

    申し訳ありませんが、タイトルと内容を修正させて頂きました。

    キャンセル

0

menu: ビルド > 構成マネージャ
で、ソリューション構成を追加しオプションを変更する

もしくは

プロジェクトを複数起こす

あるいは

共通部分をライブラリ化し、
複数プロジェクトを起こしてライブラリ+差分コード でビルドする。

※ 思いつくまま...

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/02/14 14:18

    ありがとうございます!!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.63%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる