如何使用Microsoft.Build.Evaluation.Project.RemoveItem

How to use Microsoft.Build.Evaluation.Project.RemoveItem

我已经使用以下代码成功地将文件以编程方式添加到我的项目中:

var project = new Microsoft.Build.Evaluation.Project(projPath);
project.AddItem("Compile", filePath);

但是,以编程方式删除文件让我很为难。

签名:

public bool RemoveItem(
    ProjectItem item
)

如何实例化 ProjectItem?我找不到任何示例。

参考:https://msdn.microsoft.com/en-us/library/microsoft.build.evaluation.project.removeitem.aspx

这是我写完的class。没有简单的删除解决方案。

    public static class SourceControlHelper
    {
        public static void CheckoutFile(string filePath)
        {
            TFSAction((workspace) => workspace.PendEdit(filePath), filePath);
        }

        public static void AddFile(this Project project, string filePath)
        {
            CheckoutFile(project.FullPath);
            var projectItem = project.GetProjectItem(filePath);
            if (projectItem != null)
            {
                return;
            }
            var includePath = filePath.Substring(project.DirectoryPath.Length + 1);
            project.AddItem(CompileType, includePath);
            project.Save();
            TFSAction(workspace => workspace.PendAdd(filePath), filePath);
        }

        public static void DeleteFile(this Project project, string filePath)
        {
            CheckoutFile(project.FullPath);
            var projectItem = project.GetProjectItem(filePath);
            if (projectItem == null)
            {
                return;
            }
            project.RemoveItem(projectItem);
            project.Save();
            TFSAction(workspace => workspace.PendDelete(filePath), filePath);
        }

        private static ProjectItem GetProjectItem(this Project project, string filePath)
        {
            var includePath = filePath.Substring(project.DirectoryPath.Length + 1);
            var projectItem = project.GetItems(CompileType).FirstOrDefault(item => item.EvaluatedInclude.Equals(includePath));
            return projectItem;
        }

        private static void TFSAction(Action<Workspace> action, string filePath)
        {
            var workspaceInfo = Workstation.Current.GetLocalWorkspaceInfo(filePath);
            if (workspaceInfo == null)
            {
                Console.WriteLine("Failed to initialize workspace info");
                return;
            }
            using (var server = new TfsTeamProjectCollection(workspaceInfo.ServerUri))
            {
                var workspace = workspaceInfo.GetWorkspace(server);
                action(workspace);
            }
        }

        private static string CompileType
        {
            get { return CopyTool.Extension.Equals("ts") ? "TypeScriptCompile" : "Compile"; }
        }
    }

你做到了

      private static ProjectItem GetProjectItem(this Project project, string filePath)
    {
        var includePath = filePath.Substring(project.DirectoryPath.Length + 1);
        var projectItem = project.GetItems(CompileType).FirstOrDefault(item => item.EvaluatedInclude.Equals(includePath));
        return projectItem;
    }

在您的 GetProjectItem 方法中:

替换为:

var projectItem = project.GetItems(CompileType).FirstOrDefault(item => item.EvaluatedInclude.Equals(includePath));

有了这个:

       var projectItem = project.GetItems("Compile").ToList()
            .Where(item => item.EvaluatedInclude.Equals(includePath)).FirstOrDefault();

使用 .FirstOrDefault() 将使其只包含所有文件的第一项。我使用了 .ToList() 并使其适用于我所有具有相同 EvaluatedInclude 的项目。它完全适合我。