在NuGet Init.ps1中创建或获取解决方案文件夹

时间:2014-12-14 23:00:30

标签: visual-studio powershell nuget envdte

我正在尝试为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链接:

1 个答案:

答案 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")
}

如果解决方案文件夹已存在,则上述代码不会添加。