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

问题描述 投票:0回答:3

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

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

c# csproj
3个回答
1
投票

你做到了

      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 的项目。它完全适合我。


0
投票

这是我最终写的课程。没有简单的删除解决方案。

    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"; }
        }
    }

0
投票

更简单的代码:

Project prj = new Project("C:\MyProject\MyProject.csproj");
ProjectItem itm = prj.GetItems("Compile").SingleOrDefault(i => i.EvaluatedInclude == "MyClass.cs");
if(itm != null) prj.RemoveItem(itm);
prj.AddItem("Compile", "MyClass.cs");
© www.soinside.com 2019 - 2024. All rights reserved.