pierwsze nie że składnia nie jest poprawna dla wywoływania funkcji, to muszą być:
%(Reference.HintPath.IndexOf(...)) # Note: not supported by MSBuild
Jednak funkcje nieruchomości w MSBuild są not allowed metadanych elementu, tak że nie pomoże ty też.
Co można obejść, poprzez wywołanie oddzielnego celu, który jest w zasadzie nazywany dla każdego elementu.
<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>
Szczerze mówiąc, nie jestem pewien, czy to wystarczy, aby złapać wszystkie "naruszenia". Na przykład powyższe działa tylko dla bin\debug
, ale nie dla bin\Debug
lub innych odmian o różnych wielkościach liter, które są funkcjonalnie równoważne. Szukać dla nich, jak również, że trzeba wywołać przeciążenie IndexOf(string, StringComparison)
jednak właśnie robi:
$(HintPath.IndexOf('bin\debug', System.StringComparison.OrdinalIgnoreCase))
nie będzie działać, ponieważ rozdzielczość przeciążenie MSBuild wzrośnie IndexOf(char, Int32)
i daje ten błąd:
MSB4184: The expression ""bin\debug".IndexOf(bin\debug, System.StringComparison.OrdinalIgnoreCase)" cannot be evaluated. String must be exactly one character long.
Więc musisz przekonać go za pomocą przeciążenie IndexOf(String, Int32, Int32, StringComparison)
bezpośrednio:
$(HintPath.IndexOf('bin\debug', 0, 9, System.StringComparison.OrdinalIgnoreCase))
Być może trzeba również sprawdzić, bin\Release
lub inne odmiany. Nie jestem pewien, czy jest to najlepszy sposób, aby znaleźć odniesienie do projektu, ale jeśli znasz (i do pewnego stopnia kontrolować) swoje środowisko, to może być wykonalne.
+1: Byłem tak bardzo zainteresowany uzyskaniem własności z metadanych przedmiotu, że nie widziałem tej oczywistej rzeczy. W rzeczywistości, biorąc pod uwagę twoją konkretną potrzebę, wygląda to znacznie lepiej. –
Działa dla mnie. Żałuję, że nie mogę rozróżniać wielkości liter - IndexOf ('\ bin \ $ (Konfiguracja)', StringComparison.OrdinalIgnoreCase) - ale MSBuild nie wydaje się być w stanie wywoływać funkcji z przeciążeniami. – Jonathan
+1 Kiedy próbowałem rozwiązać problem przez miself, myślałem o tym pomyśle, ale nie zdawałem sobie sprawy, jak utworzyć instancję obiektu string (właściwie nie jestem zbyt płynny w C#). Dzięki za rozwiązanie. –