2012-05-06 14 views
5

Come accedere al contesto del progetto corrente all'interno di un'attività personalizzata in MSBuild? All'inizio sembrava che il riferimento a GlobalProjectCollection su ProjectCollection consentisse l'accesso, ma questo sembra essere vuoto, almeno quando si esegue MSBuild dalla riga di comando.Come accedere al contesto del progetto corrente all'interno di un'attività personalizzata?

posso attualmente trovare nuova istanza di Project in base al largo del file di progetto corrente nel seguente modo:

List projectAssemblies = new List(); 
using (XmlReader projectFileReader = 
    XmlReader.Create(this.BuildEngine.ProjectFileOfTaskNode)) 
{ 
    Project project = new Project(projectFileReader); 
    foreach (ProjectItem item in project.AllEvaluatedItems) 
    { 
     ... woo hoo ... 
    } 
} 

ma sembra proprio come un sacco di guai. Come posso accedere al progetto da cui è stato invocato il mio compito?

risposta

5

Non è possibile. MSBuild è stato progettato in modo specifico in modo che le singole attività abbiano accesso solo ai parametri passati esplicitamente all'attività e nient'altro. Questo rende i file MSBuild più facili da leggere, ora che sai che ogni attività è influenzata solo da ciò che hai specificato quando hai chiamato questa attività.

Il codice che hai non sta creando una copia del progetto, sta creando una nuova istanza, quindi non dovresti aspettarti che le proprietà siano le stesse. Ad esempio, un'istanza del progetto attualmente in esecuzione (da cui il tuo compito è chiamato da) potrebbe avere proprietà sovrascritte dalla riga di comando o modificate lungo il modo in cui il progetto è stato creato, mentre il progetto appena creato avrebbe valori predefiniti delle proprietà dopo la prima Il motore MSBuild passa attraverso il file.

+1

Sei corretto. Anche l'attività contiene riferimenti dal suo progetto contenitore, piuttosto che fare riferimento a qualche oggetto padre dall'interno. Poiché questo è quello che sto attualmente cercando di fare riferimento, cercherò di ricavare riferimenti in modo simile a questo compito principale. – bojolais

+0

E riguardo le proprietà globali? È possibile accedere a quelli all'interno di un'attività? – Irek

Problemi correlati