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

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

4

1 に答える 1

5

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

あなたが持っているコードはプロジェクトのコピーを作成しているのではなく、新しいインスタンスを作成しているので、プロパティが同じであると期待すべきではありません。たとえば、現在実行中のプロジェクト(タスクの呼び出し元)のインスタンスでは、コマンドラインからプロパティをオーバーライドしたり、プロジェクトのビルド中にプロパティを変更したりできますが、新しく作成したプロジェクトでは、最初の後にプロパティのデフォルト値が設定されます。 MSBuildエンジンはファイルをパススルーします。

于 2012-05-07T03:22:58.890 に答える