đầu tiên không phải là cú pháp của bạn là không chính xác cho cách gọi chức năng, nó sẽ cần phải:
%(Reference.HintPath.IndexOf(...)) # Note: not supported by MSBuild
Tuy nhiên, chức năng sở hữu trong MSBuild là not allowed trên mục siêu dữ liệu, vì thế nó sẽ không giúp bạn.
Những gì bạn có thể làm việc xung quanh điều này, bằng cách gọi một mục tiêu riêng biệt về cơ bản được gọi cho mọi mục.
<Target Name="CheckProjectReferences">
<MSBuild
Projects="$(MSBuildProjectFullPath)"
Properties="Identity=%(Reference.Identity);HintPath=%(Reference.HintPath)"
Targets="_Warn"/>
</Target>
<Target Name="_Warn">
<Warning Text="Reference $(Identity) should be a project reference. HintPath: $(HintPath)"
Condition="$(HintPath.IndexOf('bin\debug')) != -1"/>
</Target>
Thành thật mà nói, tôi không chắc liệu điều đó có đủ để bắt tất cả "vi phạm" hay không. Ví dụ: ở trên sẽ chỉ hoạt động cho bin\debug
, nhưng không hoạt động đối với bin\Debug
hoặc các biến thể hỗn hợp khác có chức năng tương đương. Để tìm kiếm họ là tốt, bạn cần phải gọi tình trạng quá tải IndexOf(string, StringComparison)
, tuy nhiên chỉ thực hiện:
$(HintPath.IndexOf('bin\debug', System.StringComparison.OrdinalIgnoreCase))
Sẽ không làm việc, bởi vì độ phân giải quá tải MSBuild sẽ đón IndexOf(char, Int32)
và cung cấp cho bạn lỗi này:
MSB4184: The expression ""bin\debug".IndexOf(bin\debug, System.StringComparison.OrdinalIgnoreCase)" cannot be evaluated. String must be exactly one character long.
vì vậy, bạn sẽ cần phải thuyết phục nó bằng cách sử dụng quá tải IndexOf(String, Int32, Int32, StringComparison)
trực tiếp:
$(HintPath.IndexOf('bin\debug', 0, 9, System.StringComparison.OrdinalIgnoreCase))
bạn có thể cũng cần phải kiểm tra bin\Release
hoặc các biến thể khác. Tôi không chắc nếu đó là cách tốt nhất để tìm ra một tham chiếu nên là một tài liệu tham khảo dự án, nhưng nếu bạn biết (và một điều khiển mở rộng nhất định) môi trường của bạn nó có thể là khả thi.
+1: Tôi đã quá quen thuộc với việc nhận được một tài sản từ siêu dữ liệu mục, rằng tôi không thấy điều rõ ràng này. Trên thực tế, với nhu cầu cụ thể của bạn, điều này có vẻ tốt hơn nhiều. –
Làm việc cho tôi. Tôi muốn tôi có thể làm tra cứu không phân biệt dạng chữ - IndexOf ('\ bin \ $ (Cấu hình)', StringComparison.OrdinalIgnoreCase) - nhưng MSBuild dường như không thể gọi các hàm có quá tải. – Jonathan
+1 Khi tôi đang cố gắng giải quyết vấn đề bằng chính mình, tôi đã nghĩ về ý tưởng này, nhưng không nhận ra, làm thế nào để tạo ra đối tượng chuỗi (thực ra, tôi không quá thông thạo C#). Cảm ơn các giải pháp. –