2016-02-16 13 views
6

Nazywamy Gulp z naszego pliku csproj jak używamy Visual Studio 2013 dla tego projektu:Run npm zainstalować tylko w razie potrzeby i/lub częściowo

<Target Name="AfterBuild"> 
    <Exec Command="gulp" /> 
</Target> 

Ponieważ jednak nadal umacnianie tego świeży projekt, często rozszerzamy gulpfile.js, aby zawierał nowe pakiety. Dev wykona np. npm install gulp-util --save-dev i napisz nowe zadanie, a wszystko będzie dobrze.

Deweloper sprawdza następnie gulpfile.js i packages.json w naszym VCS. Obecnie:

  • Teamcity ma dodatkowy etap budowy npm install;
  • Każdy programista musi ręcznie uruchomić npm install;

Konieczności pamiętać coś, co ma być zrobione ręcznie nie jest doskonałym miejscem, aby być w. W pewnym momencie mieliśmy to w naszym pliku wewnątrz Taskcsproj ...

<Exec command="npm install" /> 

... tuż przed wersją gulp, więc programiści nie mogli "zapomnieć" o podjęciu tego ręcznego kroku. Jednak może to zająć jedną lub nawet kilka sekund na każdej (re) kompilacji, co jest denerwujące.

Czy istnieje lepszy sposób rozwiązania tego problemu? W jaki sposób obsłużyć aktualizacje packages.json w projektach, w których duże (ish) zespoły rozwijają się przy użyciu Visual Studio?

+0

Co powiesz na wywołanie 'npm install' na' AfterRebuild' zamiast 'AfterBuild'? – KMoraz

+0

Rozważałem to, ale to sprawia, że ​​jest to mało znane doświadczenie programisty. Na przykład. Konsekwencją jest to, że po ostatnim wykupieniu tego projektu zwykła 'Kompilacja' nie * spowodowałaby *' npm install' i tym samym nie powiedzie się. Ale nadal obejście problemu, jeśli nie przyjdzie nam na to żadne prawdziwe rozwiązanie ... – Jeroen

Odpowiedz

2

Niestety, nie ma możliwości zainstalowania tylko nowych pakietów w npm, ale można spróbować zmniejszyć czas spędzony w tym kroku za pomocą narzędzi takich jak npm-fast-install lub npm_lazy.

+0

Oczywiście zasługujesz na nagrodę za "* pytanie nie zostało wystarczająco poświęcone *", jako że byłeś jedynym, który dał jej jakąś widoczną uwagę :-). Nie jest to jednak satysfakcjonująca odpowiedź (tzn. Sprowadza się do "* nie można wykonać/dostępne tylko obejścia *" AFAICT).W każdym razie: dzięki za twoje spostrzeżenia. – Jeroen

0

npm-install-missing łączy w sobie npm outdated i npm install, aby zainstalować wszystkie brakujące zależności w drzewie zależności.

Można dodać go do swojego projektu tak:

<Target Name="AfterBuild"> 
    <Exec command="npm-install-missing" /> 
    <Exec Command="gulp" /> 
</Target> 
0

podejście, które działa dla mnie jest użycie MSBuild incremental build support w połączeniu z plikiem pieczęć:

<PropertyGroup> 
    <!-- File with mtime of last successful npm install --> 
    <NpmInstallStampFile>node_modules/.install-stamp</NpmInstallStampFile> 
</PropertyGroup> 
<Target Name="NpmInstall" 
    BeforeTargets="BeforeBuild" 
    Inputs="package.json" 
    Outputs="$(NpmInstallStampFile)"> 
    <Exec Command="npm install" /> 
    <Touch Files="$(NpmInstallStampFile)" AlwaysCreate="true" /> 
</Target> 

NpmInstallTarget biegnie tylko gdy package.json jest nowsza niż node_modules/.install-stamp i dotyka tego pliku po pomyślnym npm install. W ten sposób npm install uruchamia się tylko raz po każdej zmianie na package.json.

Powiązane problemy