2009-01-26 164 views
54

Tôi có thể chỉ mù, nhưng có dòng lệnh nào để chỉ định biểu tượng biên dịch có điều kiện trong MSBUILD không?msbuild, định nghĩa Biểu tượng biên dịch có điều kiện

Tôi hiện đang có dòng này trong buildscript tôi:

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 

Và tôi muốn thêm một điều kiện. Trong Visual Studio, tôi chỉ có thể đi vào Project Properties => Build => Biểu tượng biên dịch có điều kiện, nhưng tôi chưa thấy tùy chọn đó cho msbuild?

Bonus Karma nếu bạn biết nếu tôi hoàn toàn có thể ghi đè lên tất cả những biểu tượng đã được xác định trong các tập tin csproj để đảm bảo rằng chỉ những điều kiện từ buildscript tôi đi vào.

+0

Và BTW, đây không phải là bản sao của http://stackoverflow.com/questions/296147/msbuild-conditional-compilation vì câu hỏi khác có cùng tiêu đề nhưng câu trả lời chỉ bao gồm sửa đổi tệp Visual Studio/Project. –

Trả lời

108

Bạn đã thấy this? (Thông tin nhất là trong bài áp chót)

/p:DefineConstants="MYSYMBOL1;MYSYMBOL2" 
+5

Đã thêm Mã, đó là nó, cảm ơn! Nó ghi đè tất cả các hằng số có thể được định nghĩa trong tệp .csproj, cũng tốt. –

+1

Tôi đã có thể cảm nhận được tiền thưởng. ;-) – Tomalak

+4

Đối với điều này để làm việc cho tôi, tôi đã buộc phải thêm này vào dòng lệnh:/t: Rebuild –

13

tôi đã phải sử dụng một không gian thay vì một dấu chấm phẩy a la bài này bằng cách Björn Lasar: http://www.linqinpark.net/2009/01/13/MSBuildWithMultipleDefineConstants.aspx

Cập nhật: blog đã biến mất;retrieved via Internet Archive:

Gần đây tôi đã phải sử dụng MSBuild trực tiếp để tự động hóa một số bản dựng. Tôi cũng đã phải cấu hình một số tiền xử lý xác định dựa trên cấu hình. Điều này thường được thực hiện bởi một lập luận như

"/p:DefineConstants=MY_PREPROC_FLAG" 

Không có gì đặc biệt này ở đây kể từ khi có đủ ý kiến ​​trên web về điều đó. Hôm nay tôi cần một Cờ hơn và tôi đã sử dụng cú pháp dòng lệnh tương tự như cách tôi biết nó từ IDE:

"/p:DefineConstants=MY_PREPROC_FLAG;YET_ANOTHER_FLAG" 

nhưng điều này đã không làm việc.

Vì vậy, các điểm được rằng nếu bạn muốn hỗ trợ nhiều định nghĩa cho một dự án bằng dòng lệnh bạn sẽ phải tách chúng bằng dấu cách đơn giản ...

"/p:DefineConstants=MY_PREPROC_FLAG YET_ANOTHER_FLAG" 

và nó sẽ được bổ sung đến (phân cách bằng dấu chấm phẩy) Định nghĩa từ IDE. Điều cần biết Tôi nghĩ ...

+2

Đây là liên kết đã chết. – chrish

+0

@ Xong rồi. FWIW bài viết được chấp nhận (mà tôi upvoted) là prob thậm chí còn có nhiều tội nhưng thủy triều đã không đi ra trên nó chưa: D –

+2

@RubenBartelink - Thực hiện tốt. – Brody

0

/p:DefineConstants là giao dịch tất cả hoặc không có gì.

Nếu bạn chỉ muốn tắt dấu vết biểu tượng, bạn có thể không chỉ làm điều đó với: msbuild /p:DefineTrace=false

Bạn phải xác định một cái gì đó để ghi đè lên tất cả những biểu tượng đã được xác định: msbuild /p:DefineConstants="RANDOM-SYMBOL"

Cảm ơn Michael Stum điểm quy tắc ẩn này ra I have also wrote a blog about it

1

Những gì được nói trong câu trả lời hợp lệ cho mã C# và cũng cho mã "Mã hóa" mã ASP.NET.Đối với dự án web ASP.NET, nếu bạn muốn thực hiện biên dịch có điều kiện trong các trang ASPX, nó hoạt động hơi khác một cách có điều kiện để hiển thị HTML trên trang (lưu ý tôi đã xóa MasterPageFile="..." AutoEventWireup="true" CodeBehind="..." Inherits="..." mà bạn thường có trong khai báo <%@ ... %> cũng):

<%@ 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 %> 

Nếu bạn loại bỏ DebugSym1 hoặc DebugSym2 từ CompilerOptions thì #else phần của #if tuyên bố có liên quan được trả lại.

Tôi nghĩ điều này đáng được đề cập đến để hoàn thành chủ đề này và có thể giúp bạn tiết kiệm thời gian. Bạn có thể tìm thấy thêm trong số này article nếu bạn quan tâm.

Các vấn đề liên quan