Как заставить IDE обновить окно обозревателя решений после добавления элементов проекта в nuget ps?

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

Если это поможет, вот код, который я использую для добавления файлов в проект — вторая функция — это то, что на самом деле вызывает пользователь.

function add-to-project ($itemType, $project)
{
  process
  {
    $bogus = $project.Xml.AddItem($itemType, $_)
  }
}

# Parse a file
function Write-TTree-MetaData ($Path = $(throw "-Path must be supplied"))
{
  $p = Get-Project
  Write-Host "Inserting the results of the parsing into project" $p.Name
  $ms = Get-MSBuildProject

  $destDir = ([System.IO.FileInfo] $p.FullName).Directory

  # Run the parse now

  CmdTFileParser -d $destDir.FullName $Path

  # Now, attempt to insert them all into the project

  $allFiles = Get-ChildItem -Path $destDir.FullName
  $allFiles | ? {$_.Extension -eq ".ntup"} | add-to-project "TTreeGroupSpec" $ms
  $allFiles | ? {$_.Extension -eq ".ntupom"} | add-to-project "ROOTFileDataModel" $ms

  # Make sure everything is saved!

  $ms.Save()
  $p.Save()
}

Этот код вызывает всплывающее забавное диалоговое окно - "Проект был изменен на диске - пожалуйста, перезагрузите" - и, надеюсь, пользователь перезагрузится, и тогда файлы отобразятся правильно... Но было бы неплохо этого избежать и просто Пусть сценарий вызывает все, что необходимо. Возможно, мне нужно выяснить, как выгрузить и перезагрузить проект?

Что мне нужно сделать, чтобы принудительно обновить обозреватель решений? Большое спасибо!


person Gordon    schedule 09.10.2011    source источник


Ответы (1)


Используя проект MSBuild, вы обходите Visual Studio и напрямую обновляете файл проекта MSBuild на диске. Самый простой способ заставить Visual Studio обновить окно обозревателя решений — использовать вместо этого объект проекта Visual Studio, который вы получаете с помощью команды Get-Project.

Ниже приведен простой пример, который добавляет файл в решение и изменяет его ItemType на ROOTFileDataModel. В примере предполагается, что у вас есть файл packages.config в корневом каталоге вашего проекта, который в настоящее время не добавлен в проект, поэтому изначально он не отображается в обозревателе решений.

# Get project's root directory.
$p = Get-Project
$projectDir = [System.IO.Path]::GetDirectoryName($p.FileName)

# Add packages.config file to project. Should appear in Solution Explorer
$newFile = [System.IO.Path]::Combine($projectDir, "packages.config")
$projectItem = $p.ProjectItems.AddFromFile($newFile)

# Change file's ItemType to ROOTFileDataModel
$itemType = $projectItem.Properties.Item("ItemType")
$itemType.Value = "ROOTFileDataModel"

# Save the project.
$p.Save()

Здесь используются основные объекты Visual Studio: Project, < href="http://msdn.microsoft.com/en-us/library/envdte.projectitem.aspx" rel="nofollow">ProjectItem и ProjectItems. Надеемся, что приведенный выше код можно адаптировать к вашим конкретным требованиям.

person Matt Ward    schedule 09.10.2011
comment
Во-первых, извините, я не видел это до сегодняшнего дня! Должно быть, я пропустил электронное письмо и пропустил значок уведомления на веб-странице. Моя вина. Во-вторых, хорошо - вот так - чтобы полностью избежать MSProject - и то, что вы сказали, имеет смысл. Я попробую модификации и вернусь к вам, если это сработает! - person Gordon; 31.01.2012