首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Microsoft.Build.Evaluation.Project.RemoveItem

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

Stack Overflow用户
提问于 2016-01-13 12:39:36
回答 2查看 1.7K关注 0票数 2

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

代码语言:javascript
复制
var project = new Microsoft.Build.Evaluation.Project(projPath);
project.AddItem("Compile", filePath);

然而,以编程方式删除文件给我带来了困难。

签名:

代码语言:javascript
复制
public bool RemoveItem(
    ProjectItem item
)

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-21 05:52:29

这是我最后写的那堂课。没有简单的删除解决方案。

代码语言:javascript
复制
    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
EN

Stack Overflow用户

发布于 2016-10-02 07:56:08

你做到了

代码语言:javascript
复制
      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方法中:

代之以:

代码语言:javascript
复制
var projectItem = project.GetItems(CompileType).FirstOrDefault(item => item.EvaluatedInclude.Equals(includePath));

在这方面:

代码语言:javascript
复制
       var projectItem = project.GetItems("Compile").ToList()
            .Where(item => item.EvaluatedInclude.Equals(includePath)).FirstOrDefault();

使用.FirstOrDefault()将使它只拥有所有文件中的第一项。我使用了.ToList(),并使它与所有具有相同.ToList的项目一起工作对我来说很管用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34766999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档