2008-09-27 23 views
6

tôi dường như không thể tìm thấy bất kỳ hữu ích tài liệu từ Microsoft về cách người ta sẽ sử dụng DelimiterInheritsFromParent thuộc tính trong các yếu tố UserMacro khi xác định Macros dùng trong sheet file .vsprops tài sản cho Visual Studio.Thuộc tính 'Dấu phân cách' và 'InheritsFromParent' có nghĩa là gì trong tệp .vsprops?

Dưới đây là cách sử dụng mẫu:

<UserMacro Name="INCLUDEPATH" Value="$(VCROOT)\Inc" 
    InheritsFromParent="TRUE" Delimiter=";"/> 

Từ ví dụ trên, tôi đoán rằng "kế thừa" thực sự có nghĩa "a) nếu định nghĩa là không có sản phẩm nào sau đó nối delimiter, và b) thêm định nghĩa mới " khi hành vi không kế thừa sẽ chỉ đơn giản là thay thế bất kỳ định nghĩa macro hiện tại nào. Có ai biết chắc chắn? Thậm chí tốt hơn, có ai có bất kỳ nguồn gợi ý nào về tài liệu thay thế cho Visual Studio .vsprops tệp và macro không?

Chú ý: đây là không giống như InheritedPropertySheets thuộc tính của phần tử VisualStudioPropertySheet, ví dụ:

<VisualStudioPropertySheet ... InheritedPropertySheets=".\my.vsprops"> 

Trong trường hợp này "kế thừa" về cơ bản có nghĩa là "bao gồm".

Trả lời

8

[Trả lời câu hỏi của riêng tôi]

InheritsFromParent nghĩa thêm vào trước. Để xác minh điều này, tôi đã làm một thử nghiệm mà tiết lộ cách Macros tài làm việc trong Visual Studio 2008. Đây là thiết lập:

  • Dự án p.vcproj bao gồm các tập tin tờ sở hữu d.vsprops ('d' cho có nguồn gốc) sử dụng thẻ InheritedPropertySheets .
  • d.vsprops bao gồm các tập tin tờ sở hữu b.vsprops ('b' cho cơ sở.)
  • p.vcproj cũng định nghĩa một sự kiện Pre-xây dựng trong đó bãi môi trường.
  • Cả hai tệp .vsprops đều chứa định nghĩa Macro người dùng.

b.vsprops

... 
<UserMacro Name="NOENV" Value="B"/> 
<UserMacro Name="OVERRIDE" Value="B" PerformEnvironmentSet="true"/> 
<UserMacro Name="PREPEND" Value="B" PerformEnvironmentSet="true"/> 
... 

d.vsprops

... 
<VisualStudioPropertySheet ... InheritedPropertySheets=".\b.vsprops"> 
<UserMacro Name="ENV" Value="$(NOENV)" PerformEnvironmentSet="true"/> 
<UserMacro Name="OVERRIDE" Value="D" PerformEnvironmentSet="true"/> 
<UserMacro Name="PREPEND" Value="D" InheritsFromParent="true" 
    Delimiter="+" PerformEnvironmentSet="true"/> 
... 

p.vcproj

... 
<Configuration ... InheritedPropertySheets=".\d.vsprops"> 
<Tool Name="VCPreBuildEventTool" CommandLine="set | sort"/> 
... 

xây dựng đầu ra

... 
ENV=B 
OVERRIDE=D 
PREPEND=D+B 
... 

Từ những kết quả này chúng ta có thể kết luận như sau:

  1. PerformEnvironmentSet="true" là cần thiết cho Macros tài khoản phải được xác định trong môi trường sử dụng cho xây dựng sự kiện. Bằng chứng: NOENV không được hiển thị trong bản dựng đầu ra.
  2. Macro người dùng là luôn được thừa kế từ các trang thuộc tính bao gồm bất kể PerformEnvironmentSet hoặc InheritsFromParent. Bằng chứng: trong b.vsprops, NOENV không được đặt trong môi trường và trong d.vsprops nó được sử dụng mà không cần InheritsFromParent.
  3. Định nghĩa lại đơn giản của Macro người dùng ghi đè bất kỳ định nghĩa nào trước đó. Bằng chứng: OVERRIDE được đặt thành D mặc dù trước đó được xác định là B.
  4. Xác định lại của một Macro người dùng với InheritsFromParent="true"prepends định nghĩa mới đối với bất kỳ định nghĩa trước, cách nhau bằng một quy định Delimiter. Chứng minh: PREPEND được thiết lập để D+B

Dưới đây là một số nguồn lực bổ sung Tôi tìm thấy cho lời giải thích của Visual Studio .vsprops file và các chủ đề liên quan, đó là từ một vài năm trở lại nhưng nó vẫn còn hữu ích (không D hoặc B+D.):

understanding the VC project system part I: files and tools

understanding the VC project system part II: configurations and the project property pages dialog

understanding the VC project system part III: macros, environment variables and sharing

understanding the VC project system part IV: properties and property inheritance

understanding the VC project system part V: building, tools and dependencies

understanding the VC project system part VI: custom build steps and build events

understanding the VC project system part VII: "makefile" projects and (re-)using environments

0

Có tài liệu về phiên bản giao diện người dùng của số here này. Rất nhiều tệp XML dường như không có giấy tờ, thường chỉ cho một schema file. Đoán của bạn như thế nào họ hoạt động là khá nhiều quyền.

0

Nó không phải là toàn bộ câu chuyện.

  • Dấu phân tách không được kế thừa. Chỉ danh sách các mục mà chúng phân tách được kế thừa: Các macro của người dùng giống nhau có thể có các dấu phân tách khác nhau trong các trang thuộc tính khác nhau nhưng chỉ sử dụng dấu phân tách được gặp lần cuối. (Tôi viết "gặp phải lần cuối" vì ở cấp dự án, chúng tôi không thể chỉ định dấu phân cách và giá trị được sử dụng ở đó là trang thuộc tính cuối cùng đã xác định kế thừa cho macro đó)
  • Dấu phân cách chỉ hoạt động nếu được tạo thành ký tự đơn.Dấu phân cách dài hơn so với một ký tự có thể có đầu tiên và/hoặc ký tự cuối cùng bị tước trong một số trường hợp, trong một nỗ lực nhầm lẫn để "tham gia" danh sách giá trị.
  • $ (Inherit) xuất hiện để hoạt động bên trong macro người dùng. Giống như tổng hợp
    thuộc tính, nó hoạt động như một trình giữ chỗ cho
    giá trị của cha mẹ và nó có thể xuất hiện nhiều lần. Khi không tìm thấy $ (Inherit), nó được ngụ ý ở đầu nếu cờ kế thừa được thiết lập.
  • $ (NoInherit) cũng có vẻ hoạt động trong các macro của người dùng (làm cho VC hoạt động như thể hộp kiểm không được kiểm tra).
  • Macro người dùng (và một số được xây dựng) xuất hiện để hoạt động khi được sử dụng để tạo đường dẫn của trang thuộc tính (công cụ chuyển đổi dự án của VC sử dụng tính năng đó). Giá trị được thực hiện bởi macro của người dùng trong trường hợp này không phải là luôn trực quan, đặc biệt nếu nó được định nghĩa lại trong các trang thuộc tính được bao gồm khác. Nói chung, những gì được "kế thừa" hoặc ghép lại là công thức chứ không phải giá trị (ví dụ: bạn không thể sử dụng macro người dùng để chụp nhanh giá trị cục bộ của (ví dụ) $ (IntDir) trong bảng thuộc tính và hy vọng sẽ " bong bóng lên "giá trị đó thông qua thừa kế, bởi vì những gì được thừa hưởng thực sự là công thức" $ (IntDir) ", giá trị của nó cuối cùng sẽ được giải quyết ở mức dự án/config/file).
  • Một tờ tài sản đã nạp được bỏ qua (dường như để tránh rằng tờ sở hữu cùng có macro sử dụng của nó tổng hợp hai lần)
  • Cả hai "/" và "\" xuất hiện để làm việc trong đường dẫn tờ tài sản (và trong hầu hết nơi VS mong đợi một con đường).
  • Đường dẫn trang thuộc tính bắt đầu bằng "/" (sau khi macro đã được giải quyết) được giả định là "./", trong đó '.' là vị trí của tờ/dự án gọi số ). Tương tự nếu đường dẫn không bắt đầu bằng "./", "../" hoặc "drive: /" (dunno về UNC).
Các vấn đề liên quan