3

ビルド中に新しいファイルを生成する MSBuild タスクがいくつかあります。カスタム ターゲットは、生成後にファイルを Compile ItemGroup に追加します。したがって、ターゲットが実行されていればビルドは機能しますが、最後のビルド以降にファイルが変更されていない場合は、MSBuild のインクリメンタル ビルド機能を使用してこれらのターゲットをスキップしたいと考えています。ただし、ビルドがターゲットをスキップした場合、生成されたファイルは含まれません。

そのため、ビルドでファイルをソリューション エクスプローラーに追加したいと考えています。ファイルを手動で追加できることはわかっています。それが私が行かなければならないルートかもしれませんが、生成されたファイルをプログラムで追加したいと思っています。

現在、Custom.targets というファイルがあります。これはすべてのプロジェクトに含まれ、新しいターゲットを挿入します。プロジェクトに *.cs を含めようとしましたが、うまくいきませんでした。

4

1 に答える 1

0

私は granadaCoder に似た何かをやってしまった。xml だけでなく、カスタム タスク内で実行することにしました。プロジェクトには、FilePath、BinPath、および HooksPath の 3 つのファイルが含まれていることを確認します。それらがすべてそこにある場合、何も起こりません。見つからない場合は、ItemGroup に追加してドキュメントを保存します。ビルド中にドキュメントを保存することはできません。そのため、保存後にビルドを再度実行する必要があります。

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Xml.Linq;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;

namespace BuildTasks
{
    public class AddFilesToProject : Task
    {
        [Required]
        public string ProjectPath { get; set; }

        [Required]
        public string FilePath { get; set; }

        [Required]
        public string BinPath { get; set; }

        [Required]
        public string HooksPath { get; set; }

        [Required]
        public string ProjectDir { get; set; }


        /// <summary>
        /// When overridden in a derived class, executes the task.
        /// </summary>
        /// <returns>
        /// true if the task successfully executed; otherwise, false.
        /// </returns>
        public override bool Execute()
        {

            try
            {
                var binRelative = BinPath.Replace(ProjectDir + "\\", "");
                var hooksRelative = HooksPath.Replace(ProjectDir + "\\", "");
                var fileRelative = FilePath.Replace(ProjectDir + "\\", "");
                XDocument document = XDocument.Load(ProjectPath);
                XNamespace ns = "http://schemas.microsoft.com/developer/msbuild/2003";

                bool foundBin = false;
                bool foundHooks = false;
                bool foundFile = false;
                XElement itemGroup = null;
                foreach (XElement el in document.Descendants(ns + "ItemGroup"))
                {
                    foreach (XElement item in el.Descendants(ns + "Compile"))
                    {
                        itemGroup = el;
                        if (item.Attribute("Include").Value.Contains(binRelative))
                        {
                            foundBin = true;
                            Log.LogMessage(MessageImportance.Low, "FoundBin: {0}", foundBin);
                        }
                        else if (item.Attribute("Include").Value.Contains(hooksRelative))
                        {
                            foundHooks = true;
                            Log.LogMessage(MessageImportance.Low, "FoundHooks: {0}", foundHooks);
                        }
                        else if (item.Attribute("Include").Value.Contains(fileRelative))
                        {
                            foundFile = true;
                            Log.LogMessage(MessageImportance.Low, "FoundFile: {0}", foundFile);
                        }
                    }
                }

                if (!foundBin)
                {
                    XElement item = new XElement(ns + "Compile");
                    item.SetAttributeValue("Include", binRelative);
                    if (itemGroup != null) itemGroup.Add(item);
                }
                if (!foundHooks)
                {
                    XElement item = new XElement(ns + "Compile");
                    item.SetAttributeValue("Include", hooksRelative);
                    if (itemGroup != null) itemGroup.Add(item);
                }
                if (!foundFile)
                {
                    XElement item = new XElement(ns + "Compile");
                    item.SetAttributeValue("Include", fileRelative);
                    if (itemGroup != null) itemGroup.Add(item);                    
                }
                if (!foundBin || !foundHooks || !foundFile)
                {
                    document.Save(ProjectPath);
                }
            }
            catch (Exception e)
            {
                Log.LogErrorFromException(e);
            }

            return !Log.HasLoggedErrors;
        }
    }
}
于 2013-10-18T14:39:56.703 に答える