我正在尝试为NuGet包创建一个Init.ps1
脚本,该脚本将项目添加到解决方案文件夹中,该文件夹可能已经存在,也可能不存在。
脚本成功添加或替换文件系统中的文件,如果没有此类解决方案文件夹,则项目已成功添加到新创建的解决方案文件夹中,但是,如果解决方案文件夹已存在,则会创建名为NewFolder1的新解决方案文件夹(或者如果已经存在,则为2),并且没有文件添加到解决方案中。
param($installPath, $toolsPath, $package)
$solutionNode = Get-Interface $dte.Solution ([EnvDTE80.Solution2])
$solutionItemsNode = $solutionNode.FindProjectItem("FolderName")
$solutionItemsProjectItems = Get-Interface $solutionNode.ProjectItems ([EnvDTE.ProjectItems])
if (!$solutionItemsProjectItems) {
$solutionItemsNode = $solutionNode.AddSolutionFolder("FolderName")
$solutionItemsProjectItems = Get-Interface $solutionItemsNode.ProjectItems ([EnvDTE.ProjectItems])
}
$rootDir = (Get-Item $installPath).parent.parent.fullname
$deploySource = join-path $installPath '\sln\'
$deployTarget = join-path $rootDir '\FolderName\'
New-Item -ItemType Directory -Force -Path $deployTarget
ls $deploySource | foreach-object {
$targetFile = join-path $deployTarget $_.Name
Copy-Item $_.FullName $targetFile -Recurse -Force
$solutionItemsProjectItems.AddFromFile($targetFile) > $null
} > $null
我尝试了各种更改,例如检查$solutionItemsNode
而不是$solutionItemsProjectItems
(效果相同),直接添加到解决方案而不是解决方案文件夹(什么都不做)以及以下更改的行为相同原文:
$solutionItemsNode = $solution.Projects | where-object { $_.ProjectName -eq "FolderName" } | select -first 1
if (!$solutionItemsNode) {
$solutionItemsNode = $solutionNode.AddSolutionFolder("FolderName")
}
有什么指针吗?
相关的Q& As和MSDN链接:
答案 0 :(得分:6)
将解决方案文件夹添加到解决方案时,可以从EnvDTE80.Solution2的Projects属性中获取。
所以使用$ solutionNode.Projects似乎有效。对代码的唯一修改是使用 $ solutionNode.Projects 而不是 $ solution.Projects ,因为$ solution不存在于任何地方,因此结果总是$空。
$solutionItemsNode = $solutionNode.Projects | where-object { $_.ProjectName -eq "FolderName" } | select -first 1
if (!$solutionItemsNode) {
$solutionItemsNode = $solutionNode.AddSolutionFolder("FolderName")
}
如果解决方案文件夹已存在,则上述代码不会添加。