2012-05-06 6 views
5

MSBuildのカスタムタスク内で現在のプロジェクトコンテキストにアクセスするにはどうすればよいですか?最初は、ProjectCollectionのGlobalProjectCollectionリファレンスがアクセスを許可するように見えましたが、少なくともコマンドラインからMSBuildを実行しているときは、これは空であるようです。カスタムタスク内で現在のプロジェクトコンテキストにアクセスするにはどうすればよいですか?

私は現在、次のように、現在のプロジェクトファイルのオフに基づいて新しいプロジェクトインスタンスを取得することができます。

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 ... 
    } 
} 

それだけで多くの問題のように思えます。自分のタスクが呼び出されたプロジェクトにアクセスするにはどうすればよいですか?

答えて

5

できません。 MSBuildは、個々のタスクが明示的にタスクに渡したパラメータのみにアクセスできるように特別に設計されています。これにより、MSBuildファイルの読み込みが容易になりました。各タスクは、このタスクを呼び出したときに指定した内容にのみ影響を受けます。

あなたが持っているコードは、プロジェクトのコピーを作成していない、それは新しいインスタンスを作成しているので、あなたは性質が同じであることを期待すべきではありません。たとえば、現在実行中のプロジェクトのインスタンス(タスクが呼び出された場所)は、コマンドラインからオーバーライドされたプロパティを持つことも、プロジェクトの作成方法に沿って変更することもできます。新しく作成したプロジェクトは、 MSBuildエンジンがファイルを通過します。

+1

あなたは正しいですか? タスクであっても、内部からの親オブジェクトを参照するのではなく、コンテナプロジェクトからの参照が渡されます。これが私が現在参照しようとしているものなので、私はこのコア・タスクと同様の方法でリファレンスを導き出すつもりです。 – bojolais

+0

グローバルプロパティはどうですか?それらはタスク内でアクセスできますか? – Irek

関連する問題