Как получить IDE для обновления окна обозревателя решений после добавления элементов проекта в Nuget PS? - PullRequest
0 голосов
/ 09 октября 2011

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

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

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()
}

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

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

1 Ответ

0 голосов
/ 09 октября 2011

Используя проект 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 , ProjectItem и ProjectItems . Надеемся, что приведенный выше код может быть адаптирован к вашим конкретным требованиям.

...