Prima non è che la sintassi non è corretta per le funzioni di invocare, si avrebbe bisogno di essere:
%(Reference.HintPath.IndexOf(...)) # Note: not supported by MSBuild
Tuttavia, le funzioni di proprietà in MSBuild sono not allowed sui metadati voce, in modo che non sta andando per aiutare neanche tu.
Che cosa si potrebbe ovviare a questo, invocando un obiettivo separato che è fondamentalmente chiamato per ogni articolo.
<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>
Francamente, non sono sicuro che sia sufficiente per cogliere tutte le "violazioni". Ad esempio, quanto sopra funzionerà solo per bin\debug
, ma non per bin\Debug
o altre varianti con involucro misto, che sono funzionalmente equivalenti. Per cercare per loro, avresti bisogno di chiamare il IndexOf(string, StringComparison)
sovraccarico, ma solo facendo:
$(HintPath.IndexOf('bin\debug', System.StringComparison.OrdinalIgnoreCase))
Non funzionerà, perché la risoluzione di sovraccarico MSBuild vi verrà a prendere IndexOf(char, Int32)
e vi darà questo errore:
MSB4184: The expression ""bin\debug".IndexOf(bin\debug, System.StringComparison.OrdinalIgnoreCase)" cannot be evaluated. String must be exactly one character long.
Quindi, è necessario convincere esso utilizzando il IndexOf(String, Int32, Int32, StringComparison)
sovraccarico direttamente:
$(HintPath.IndexOf('bin\debug', 0, 9, System.StringComparison.OrdinalIgnoreCase))
potrebbe essere necessario controllare anche per la bin\Release
o altre varianti. Non sono sicuro che quello sia il modo migliore per capire un riferimento dovrebbe essere un riferimento al progetto, ma se si conosce (e per un certo controllo esteso) il proprio ambiente potrebbe essere fattibile.
+1: Ero così interessato a ottenere una proprietà dai metadati dell'articolo, che non ho visto questa cosa ovvia. In realtà, dato il tuo bisogno specifico, questo sembra molto meglio. –
Funziona per me. Vorrei poter fare una ricerca senza distinzione tra maiuscole e minuscole - IndexOf ('\ bin \ $ (Configuration)', StringComparison.OrdinalIgnoreCase) - ma MSBuild non sembra in grado di richiamare funzioni con sovraccarichi. – Jonathan
+1 Quando stavo cercando di risolvere il problema da solo, ho pensato a questa idea, ma non mi ero reso conto di come istanziare l'oggetto stringa (in realtà, non sono molto fluente in C#). Grazie per la soluzione. –