在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()
}
此代码会弹出一个有趣的对话框 - “项目已在磁盘上修改 - 请重新加载” - 希望用户重新加载,然后文件正确显示...但是避免它会很好那只是让脚本导致任何需要发生的事情。也许我必须弄清楚如何卸载和重新加载项目?
强制解决方案资源管理器更新需要做些什么?非常感谢!
答案 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对象是Project,ProjectItem和ProjectItems对象。希望上面的代码可以根据您的具体要求进行调整。