2017-09-29 14 views
9

Tytuł mówi wszystko. Mam pliki, które chcę zagnieździć podczas instalacji pakietu NuGet, ale nie mogę korzystać ze skryptów PowerShell, ponieważ nie będą one dłużej działać (see here).Zagnieżdżanie plików w pakiecie Nuget bez PowerShell

Czy istnieją inne sposoby osiągnięcia tego celu?


UPDATE: przez zagnieżdżone Znaczy jak *.resx i *.Designer.cs lub *.xaml i kodu z opóźnieniem pliki *.xaml.cs. Wiem, że mogę to osiągnąć dodając element <DependentUpon> w pliku * .csproj, ale nie wiem, w jaki sposób mogę dodać ten element bez użycia PowerShell.

Screenshot of nested files in solution explorer


Update2:init.ps1 runs the first time a package is installed in a solution. To jednak nie wystarczy. Potrzebuję skryptu do uruchomienia, gdy pakiet zostanie zainstalowany w projekcie, podobnie jak install.ps1 został uruchomiony na NuGet3.


UPDATE3: Co chcę zrobić, to dodać 3 pliki do folderu Properties projektów docelowych (Resources.resx, Resources.tt i Resources.Designer.cs). Są one zamiennikiem zwykłej implementacji zasobów. Pliki te są instalowane przez pakiet nuget po dodaniu go do projektu.

Jest to część pliku *.nuspec, która dodaje je do folderu Content pakietu. Ponieważ tylko jeden z nich jest faktycznie treścią (inne są odpowiednio Osadzonym zasobem i kompilacją), byłoby miło móc ustawić ich działania kompilacyjne odpowiednio, ale krok po kroku.

<files> 
    <file src="Properties\Resources.resx" target="content\Properties\Resources.resx" /> 
    <file src="Properties\Resources.tt.pp" target="content\Properties\Resources.tt.pp" /> 
    <file src="Properties\Resources.Designer.cs" target="content\Properties\Resources.Designer.cs" /> 
</files> 

Ponieważ pliki te są dodawane do projektów chcę zagnieżdżenie wewnątrz pliku *.csproj i nie zdarzają się za pomocą oddzielnego *.props pliku, jeśli jest to jakoś możliwe.

+0

Co rozumiesz przez "pliki gniazd"? tworząc strukturę drzewa w twoim nupkg? –

+0

@MartinUllrich zobacz moją aktualizację –

+1

'Obsługa skryptu Powershell została zmodyfikowana tak, aby już nie wykonywać skryptów instalacyjnych i deinstalacyjnych, ale skrypty init są nadal wykonywane' <- _some_ skrypty nie będą działały więcej ... ale inne będą! – gvee

Odpowiedz

1

Pakiety mogą dodawać elementy MSBuild do tego projektu za pomocą pliku .props w pakiecie. Zawierałaby tę samą zawartość, którą umieściłbyś w pliku .csproj.

Wadą tego jest to, że użytkownik nie może zmodyfikować treści. Jeśli chcesz zmodyfikować rzeczywisty plik projektu użytkownika i skopiować zawartość do folderu projektu, musisz dołączyć plik .targets do pakietu i ustawić BeforeTargets = "Build" na twoim celu. Daje to szansę na uruchomienie przed kompilacją i wprowadzenie zmian w razie potrzeby.

Folder kompilacji działa zarówno dla pakietów packages.config, jak i PackageReference (NETCore SDK). Więcej informacji na ten temat można znaleźć tutaj: https://docs.microsoft.com/en-us/nuget/create-packages/creating-a-package#including-msbuild-props-and-targets-in-a-package

+0

Plik '* .props' nie jest rozwiązaniem, ponieważ przynajmniej jeden z zainstalowanych plików musi być edytowalny. Plik '* .targets' nie pomógłby, ponieważ jedyną rzeczą, która mogłaby zrobić, byłoby wywołanie skryptu powłoki, którego chcę uniknąć, jeśli to możliwe. Odpowiednio zaktualizowałem moje pytanie. –

+0

Plik rekwizytów/celów daje ci możliwość wykonania własnych skryptów i wprowadzenia wymaganych zmian.NuGet nie zapewnia wbudowanego sposobu kopiowania zawartości do projektu lub uruchamiania skryptu podczas instalacji/deinstalacji, ponieważ ta koncepcja nie istnieje w przypadku projektów PackageReference, w których wykres zależności jest obliczany niezależnie dla każdego przywracania. –

+0

To nie jest w 100% tym, co chcę być szczery. Chcę odejść od PowerShell, a nie wywoływać PowerShell z niestandardowego celu. Ale to się stało, a szkoda byłoby pozwolić, by nagroda poszła zmarnować po raz drugi. –

Powiązane problemy