2016-01-13 8 views
1

Я добавил файлы успешно программно для моего проекта, используя следующий код:Как использовать 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

+0

Вы когда-нибудь это выясняли? Я предполагаю, что вы будете проходить через Элементы и удалять тот, который хотите удалить. В моем случае я хотел бы изменить один из элементов, чтобы обратиться к другому файлу. – tofutim

+0

@tofutim вы правы. Я не мог найти более простой способ, но итерировать все элементы. См. Мой ответ – Mugen

ответ

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

вы сделали

 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. он полностью работал на меня.