2017-03-08 26 views
13

W Visual Studio 2015 używam pakietu NuGet Unofficial.Microsoft.VisualStudio.TextTemplating.14.0.0, który pozwala mi przekształcać szablony T4 bezpośrednio z MSBuild, za każdym razem, gdy budowany jest projekt.Obsługa MSBuild dla szablonów T4 w Visual Studio 2017 RTM

W Visual Studio 2017 RTM to jednak łamie budować z następujących komunikatów:

An Exception was thrown while running the transformation code. The process cannot continue. The following Exception was thrown: System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.CodeAnalysis, Version=1.3.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified. File name: 'Microsoft.CodeAnalysis, Version=1.3.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'

ten jest podnoszony przez plik Unofficial.Microsoft.VisualStudio.TextTemplating.targets(396,5) który jest w tym pakiecie.

Domyślam się, że błąd pochodzi z próby użycia tych celów z wersji VS 2017 z powodu niedopasowanych środowisk, ale nie wiem, jak śledzić dokładny problem. Nie ma jeszcze zaktualizowanego pakietu dla v15, który widzę.

Jak mogę wykonać transformacje T4 z MSBuild, które będą działać dla VS 2017? Czy pojawi się nowa paczka z NuGet do wykorzystania w jakimś momencie lub czy to nie będzie już wspierane?

Odpowiedz

18

Znalazłem właściwe rozwiązanie.

Okazuje się, że SDK T4 jest teraz włączone jako część programu Visual Studio 2017 (i nie jest częścią oddzielnego SDK Modeling jak miało to miejsce w przeszłości), ale trzeba go zainstalować poprzez Visual Studio extension development zestawu narzędzi w VS2017 instalator (funkcja transformacji szablonu tekstowego).

Gdy ten jest zainstalowany, można użyć MSBuild przekształcić szablony importując odpowiednie cele w projekcie MSBuild:

<PropertyGroup> 
    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">15.0</VisualStudioVersion> 
    <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath> 
    <TransformOnBuild>True</TransformOnBuild> 
    <TransformOutOfDateOnly>false</TransformOutOfDateOnly> 
</PropertyGroup> 

<!-- add AFTER import for $(MSBuildToolsPath)\Microsoft.CSharp.targets --> 
<Import Project="$(VSToolsPath)\TextTemplating\Microsoft.TextTemplating.targets" /> 

to rozwiązać mój problem i usuwa również potrzebę oddzielnej nieoficjalnych pakietu Nuget.

+0

Cieszę się, że rozwiązałeś ten problem. Proszę zaznaczyć swoją odpowiedź, która jest korzystna dla innych społeczności, które mają ten sam problem. –

+0

Bardzo mi to pomogło (dziękuję!), Ale chcę podkreślić, że działa tylko z projektami .NET Framework, a nie z projektami .NET Standard, przynajmniej takimi, jakie są, tylko dla FYI. –

+1

@JorgeYanesDiez, prawdopodobnie musisz " zamiast 'Microsoft.CSharp.targets'. Zobacz moje komentarze i odpowiedź na OP na http://webcache.googleusercontent.com/search?q=cache:http://www.natemcmaster.com/blog/2017/03/09/vs2015-to-vs2017-upgrade/&gws_rd = cr & ei = yo9TWbKIPMS0aY_zqJAB –

-2

Miałem podobny problem, gdy mój Hosted Agent w Visual Studio Team Service nie wygenerował danych wyjściowych szablonu, co spowodowało uszkodzenie mojego serwera kompilacji, ponieważ brakowało wygenerowanych plików CS.

Dane wyjściowe szablonu CS są generowane poprawnie podczas budowania z programu Visual Studio 2015 na komputerze programisty.

Patrząc na różne rozwiązania, takie jak powyższe, stało się dla mnie jasne, że bardziej celową poprawką jest po prostu zatwierdzenie wygenerowanych plików do mojego systemu kontroli źródła. To ma tę dodatkową zaletę, że mogę kod przeglądać wszelkie zmiany w wynikach, a nie tylko szablon.

+1

Tak, ale to może łatwo spowodować problemy, jeśli wygenerowany kod nie jest aktualny - na przykład programista zapomina o kompilacji lub ponownie uruchamia szablony T4 ręcznie przed wprowadzeniem zmian, co oznacza, że ​​wygenerowane źródło jest również potencjalnie nieaktualne również w kontroli źródła. O ile nie można zapewnić, że wygenerowane źródło jest zawsze aktualne w odniesieniu do jego danych wejściowych, samo wprowadzenie go do kontroli źródła nie wystarczy. Dlatego tak ważna jest możliwość uruchamiania szablonów na kompilacji. – Sam

+0

Można łatwo zauważyć, że dane wyjściowe nie są aktualizowane za pomocą recenzji kodu. Ale masz rację, to tylko obejście, które jest wygodne tylko dla bardzo małych projektów. Mine to projekt jednoosobowy z kilkoma wygenerowanymi plikami CS. – Slion

+0

Niektóre z naszych wygenerowanych plików zawierają setki lub tysiące linii - nie zauważysz w nich błędów ludzkim okiem, nawet jeśli widać różnicę! – Sam

Powiązane problemy