2011-06-23 12 views
31

Chcę dodać foldery rozwiązań i elementy rozwiązania (nie projekty) do pliku rozwiązania za pomocą pakietu NuGet. Wyobrażam sobie, że byłoby to możliwe dzięki Powershell. Przejrzałem dokumentację dla NuGet, Powershell i EnvDTE i nie mogę wymyślić:Dodawanie elementów poziomu rozwiązania w pakiecie NuGet

  1. Jakie polecenia/metody użyłbym?
  2. Który standardowy skrypt bym to zrobił w Init.ps1, Install.ps1, czy gdzieś indziej?

Odpowiedz

51

Oto skrypt PowerShell, który utworzy folder rozwiązania o nazwie Parent i inny folder rozwiązania o nazwie Child wewnątrz tego. Dodaje również plik projektu (MyProject.csproj) do folderu rozwiązania 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) 

Dwa główne interfejsy Visual Studio używane jest tutaj Solution2 i SolutionFolder. Korzysta również z funkcji Get-Interface, którą zapewnia NuGet.

Dla pakietu tylko dla rozwiązań powinieneś umieścić swój skrypt w init.ps1, ponieważ install.ps1 jest wywoływany tylko dla pakietów opartych na projektach. Init.ps1 uruchamia się raz dla rozwiązania, gdy pakiet jest instalowany po raz pierwszy i za każdym razem, gdy rozwiązanie jest ponownie otwierane w Visual Studio.

Aby dodać dowolne pliki (pliki non-Project) do folderu rozwiązanie trzeba będzie zrobić coś podobnego do poniższego:

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

Czego brakuje z tego skryptu PowerShell jest standardowe deklaracje parametr na góra pliku.

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

Brakuje również informacji o tym, czy folder rozwiązania i element folderu już istnieją. Zostawię to jako ćwiczenie dla ciebie.

+0

Dziękuję, właśnie tego szukałem. – brainiac10

+0

jest jakiś sposób debugowania skryptu init? – smnbss

+1

Możesz wypróbować set-psdebug w konsoli NuGet Package Manager. Po prostu próbowałem uruchamiać polecenia w oknie konsoli przeciwko aktywnemu projektowi. Inną alternatywą jest zapisywanie danych wyjściowych w oknie konsoli. –

Powiązane problemy