32

我想通过 NuGet 包将解决方案文件夹和解决方案项(不是项目)添加到解决方案文件中。我想这将通过 Powershell 来完成。我查看了 NuGet、Powershell 和 EnvDTE 的文档,但无法弄清楚:

  1. 我会使用哪些命令/方法?
  2. 我会在哪个标准脚本中执行此操作,Init.ps1、Install.ps1 或其他地方?
4

1 回答 1

52

这是一个 PowerShell 脚本,它将在其中创建一个名为 Parent 的解决方案文件夹和另一个名为 Child 的解决方案文件夹。它还在子解决方案文件夹中添加了一个项目文件 (MyProject.csproj)。

# Get the open solution.
$solution = Get-Interface $dte.Solution ([EnvDTE80.Solution2])

# Create the parent solution folder.
$parentProject = $solution.AddSolutionFolder("Parent")

# Create a child solution folder.
$parentSolutionFolder = Get-Interface $parentProject.Object ([EnvDTE80.SolutionFolder])
$childProject = $parentSolutionFolder.AddSolutionFolder("Child")

# Add a file to the child solution folder.
$childSolutionFolder = Get-Interface $childProject.Object ([EnvDTE80.SolutionFolder])
$fileName = "D:\projects\MyProject\MyProject.csproj"
$projectFile = $childSolutionFolder.AddFromFile($fileName)

此处使用的两个主要 Visual Studio 接口是Solution2SolutionFolder。它还使用了 NuGet 提供的 Get-Interface 函数。

对于仅解决方案包,您应该将脚本放在 init.ps1 中,因为install.ps1仅对基于项目的包调用。Init.ps1 在首次安装包时为解决方案运行一次,并且每次在 Visual Studio 中重新打开解决方案时。

要将任意文件(非项目文件)添加到解决方案文件夹,您需要执行类似于以下的操作:

$vsSolution = Get-Interface $dte.Solution ([EnvDTE80.Solution2])
$vsProject = $vsSolution.AddSolutionFolder("newFolder")
$projectItems = Get-Interface $vsProject.ProjectItems ([EnvDTE.ProjectItems])
$projectItems.AddFromFile("pathToFileToAdd.txt")

此 PowerShell 脚本中缺少的是文件顶部的标准参数声明。

param($installPath, $toolsPath, $package, $project)

还缺少检查解决方案文件夹和文件夹项是否已存在。我将把它留给你做一个练习。

于 2011-06-25T15:49:36.723 回答