0

在 nuget install 期间,我给用户一个他们可以运行的命令。该命令基本上是扫描一些文件并创建一些代码模板,然后将它们插入到当前项目中。这工作得很好——除了解决方案资源管理器没有用新文件更新它的树视图。我知道这行得通,因为我可以卸载并重新加载项目文件并且文件在那里。

如果有帮助,这里是我用来将文件添加到项目中的代码——第二个函数是用户实际调用的函数。

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

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

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

4

1 回答 1

0

通过使用 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 对象是ProjectProjectItemProjectItems对象。希望上面的代码可以适应您的特定要求。

于 2011-10-09T11:00:54.913 回答