2011-06-23 10 views
31

Quiero agregar carpetas de solución y elementos de solución (no proyectos) a un archivo de solución a través de un paquete NuGet. Me imagino que esto se logrará a través de Powershell. He revisado la documentación para NuGet, Powershell y EnvDTE y no puedo entender:Agregar elementos de nivel de solución en un paquete NuGet

  1. ¿Qué comandos/métodos usaría?
  2. ¿Qué secuencia de comandos estándar haría en, Init.ps1, Install.ps1 o en otro lugar?

Respuesta

51

Aquí hay un script de PowerShell que creará una carpeta de solución llamada Parent y otra carpeta de solución llamada Child dentro de esa. También agrega un archivo de proyecto (MyProject.csproj) dentro de la carpeta de la solución Child.

# 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) 

Los dos principales interfaces de Visual Studio que se utilizan aquí son Solution2 y SolutionFolder. También utiliza la función Get-Interface que proporciona NuGet.

Para un paquete de solución única, debe colocar su secuencia de comandos en init.ps1 porque install.ps1 solo se invoca para paquetes basados ​​en proyectos. Init.ps1 se ejecuta una vez para una solución cuando el paquete se instala por primera vez y cada vez que se vuelve a abrir la solución en Visual Studio.

Para agregar archivos arbitrarios (archivos no pertenecen al proyecto) a una carpeta de la solución tendrá que hacer algo similar a lo siguiente:

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

lo que falta en este script PowerShell es las declaraciones de parámetros estándar en el parte superior del archivo.

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

Lo que también hace falta es comprobar si la carpeta de solución y elemento de carpeta ya existen. Lo dejaré como un ejercicio para que hagas.

+0

Gracias, esto es exactamente lo que estaba buscando. – brainiac10

+0

¿hay alguna forma de depurar el script de inicio? – smnbss

+1

Puede probar set-psdebug en la consola de NuGet Package Manager. Simplemente intenté ejecutar los comandos en la ventana de la consola contra un proyecto activo. La otra alternativa es escribir salida en la ventana de la consola. –

Cuestiones relacionadas