如何在nuget ps中添加项目项后让IDE更新解决方案资源管理器窗口?

时间:2011-10-09 07:34:33

标签: visual-studio-2010 nuget solution-explorer

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

此代码会弹出一个有趣的对话框 - “项目已在磁盘上修改 - 请重新加载” - 希望用户重新加载,然后文件正确显示...但是避免它会很好那只是让脚本导致任何需要发生的事情。也许我必须弄清楚如何卸载和重新加载项目?

强制解决方案资源管理器更新需要做些什么?非常感谢!

1 个答案:

答案 0 :(得分:0)

通过使用MSBuild项目,您绕过Visual Studio并直接更新磁盘上的MSBuild项目文件。让Visual Studio更新Solutions Explorer窗口的最简单方法是使用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对象是ProjectProjectItemProjectItems对象。希望上面的代码可以根据您的具体要求进行调整。