Bu biraz eski ama bu yüzden koştum çözüm burada koştu.
Sorun:
Geliştirme ekibimiz AngularJS / Bootstrap'e geçirdiğimiz birçok .NET web uygulaması ürününü bulundurmaktadır. VS2010, özel yapım süreçlerine kolayca borç vermez ve geliştiricilerim rutin olarak ürünlerimizin çoklu sürümleri üzerinde çalışıyorlar. VCS'imiz Subversion (Biliyorum, biliyorum. Git'e geçmeye çalışıyorum ama sinir bozucu pazarlama ekibim çok zorlu) ve tek bir VS çözümü birkaç ayrı proje içerecek. Aynı Düğüm paketlerini (yudum, bower vb.) Aynı makineye birkaç kez kurmak zorunda kalmadan geliştirme ortamlarını başlatmak için ortak bir yönteme sahip olmam gerekiyordu.
TL; DR:
Bir .NET ürünü için yerel olarak gerekli tüm paketlerin yanı sıra genel Düğüm / Bower geliştirme ortamını yüklemek için "npm install" gerekir.
Global paketler yalnızca önceden kurulmamışsa kurulmalıdır.
Global paketlere yerel bağlantılar otomatik olarak oluşturulmalıdır.
Çözüm:
Zaten tüm geliştiriciler ve tüm ürünler tarafından paylaşılan ortak bir geliştirme çerçevemiz var, bu yüzden gerektiğinde global paketleri yüklemek ve yerel bağlantıları oluşturmak için bir NodeJS betiği oluşturdum. Komut dosyası, ürün temel klasörüne göre ".... \ SharedFiles" dizininde bulunur:
/*******************************************************************************
* $Id: npm-setup.js 12785 2016-01-29 16:34:49Z sthames $
* ==============================================================================
* Parameters: 'links' - Create links in local environment, optional.
*
* <p>NodeJS script to install common development environment packages in global
* environment. <c>packages</c> object contains list of packages to install.</p>
*
* <p>Including 'links' creates links in local environment to global packages.</p>
*
* <p><b>npm ls -g --json</b> command is run to provide the current list of
* global packages for comparison to required packages. Packages are installed
* only if not installed. If the package is installed but is not the required
* package version, the existing package is removed and the required package is
* installed.</p>.
*
* <p>When provided as a "preinstall" script in a "package.json" file, the "npm
* install" command calls this to verify global dependencies are installed.</p>
*******************************************************************************/
var exec = require('child_process').exec;
var fs = require('fs');
var path = require('path');
/*---------------------------------------------------------------*/
/* List of packages to install and 'from' value to pass to 'npm */
/* install'. Value must match the 'from' field in 'npm ls -json' */
/* so this script will recognize a package is already installed. */
/*---------------------------------------------------------------*/
var packages =
{
"bower" : "bower@1.7.2",
"event-stream" : "event-stream@3.3.2",
"gulp" : "gulp@3.9.0",
"gulp-angular-templatecache" : "gulp-angular-templatecache@1.8.0",
"gulp-clean" : "gulp-clean@0.3.1",
"gulp-concat" : "gulp-concat@2.6.0",
"gulp-debug" : "gulp-debug@2.1.2",
"gulp-filter" : "gulp-filter@3.0.1",
"gulp-grep-contents" : "gulp-grep-contents@0.0.1",
"gulp-if" : "gulp-if@2.0.0",
"gulp-inject" : "gulp-inject@3.0.0",
"gulp-minify-css" : "gulp-minify-css@1.2.3",
"gulp-minify-html" : "gulp-minify-html@1.0.5",
"gulp-minify-inline" : "gulp-minify-inline@0.1.1",
"gulp-ng-annotate" : "gulp-ng-annotate@1.1.0",
"gulp-processhtml" : "gulp-processhtml@1.1.0",
"gulp-rev" : "gulp-rev@6.0.1",
"gulp-rev-replace" : "gulp-rev-replace@0.4.3",
"gulp-uglify" : "gulp-uglify@1.5.1",
"gulp-useref" : "gulp-useref@3.0.4",
"gulp-util" : "gulp-util@3.0.7",
"lazypipe" : "lazypipe@1.0.1",
"q" : "q@1.4.1",
"through2" : "through2@2.0.0",
/*---------------------------------------------------------------*/
/* fork of 0.2.14 allows passing parameters to main-bower-files. */
/*---------------------------------------------------------------*/
"bower-main" : "git+https://github.com/Pyo25/bower-main.git"
}
/*******************************************************************************
* run */
/**
* Executes <c>cmd</c> in the shell and calls <c>cb</c> on success. Error aborts.
*
* Note: Error code -4082 is EBUSY error which is sometimes thrown by npm for
* reasons unknown. Possibly this is due to antivirus program scanning the file
* but it sometimes happens in cases where an antivirus program does not explain
* it. The error generally will not happen a second time so this method will call
* itself to try the command again if the EBUSY error occurs.
*
* @param cmd Command to execute.
* @param cb Method to call on success. Text returned from stdout is input.
*******************************************************************************/
var run = function(cmd, cb)
{
/*---------------------------------------------*/
/* Increase the maxBuffer to 10MB for commands */
/* with a lot of output. This is not necessary */
/* with spawn but it has other issues. */
/*---------------------------------------------*/
exec(cmd, { maxBuffer: 1000*1024 }, function(err, stdout)
{
if (!err) cb(stdout);
else if (err.code | 0 == -4082) run(cmd, cb);
else throw err;
});
};
/*******************************************************************************
* runCommand */
/**
* Logs the command and calls <c>run</c>.
*******************************************************************************/
var runCommand = function(cmd, cb)
{
console.log(cmd);
run(cmd, cb);
}
/*******************************************************************************
* Main line
*******************************************************************************/
var doLinks = (process.argv[2] || "").toLowerCase() == 'links';
var names = Object.keys(packages);
var name;
var installed;
var links;
/*------------------------------------------*/
/* Get the list of installed packages for */
/* version comparison and install packages. */
/*------------------------------------------*/
console.log('Configuring global Node environment...')
run('npm ls -g --json', function(stdout)
{
installed = JSON.parse(stdout).dependencies || {};
doWhile();
});
/*--------------------------------------------*/
/* Start of asynchronous package installation */
/* loop. Do until all packages installed. */
/*--------------------------------------------*/
var doWhile = function()
{
if (name = names.shift())
doWhile0();
}
var doWhile0 = function()
{
/*----------------------------------------------*/
/* Installed package specification comes from */
/* 'from' field of installed packages. Required */
/* specification comes from the packages list. */
/*----------------------------------------------*/
var current = (installed[name] || {}).from;
var required = packages[name];
/*---------------------------------------*/
/* Install the package if not installed. */
/*---------------------------------------*/
if (!current)
runCommand('npm install -g '+required, doWhile1);
/*------------------------------------*/
/* If the installed version does not */
/* match, uninstall and then install. */
/*------------------------------------*/
else if (current != required)
{
delete installed[name];
runCommand('npm remove -g '+name, function()
{
runCommand('npm remove '+name, doWhile0);
});
}
/*------------------------------------*/
/* Skip package if already installed. */
/*------------------------------------*/
else
doWhile1();
};
var doWhile1 = function()
{
/*-------------------------------------------------------*/
/* Create link to global package from local environment. */
/*-------------------------------------------------------*/
if (doLinks && !fs.existsSync(path.join('node_modules', name)))
runCommand('npm link '+name, doWhile);
else
doWhile();
};
Şimdi geliştiricilerimiz için global bir aracı güncellemek istersem, "paket" nesnesini günceller ve yeni komut dosyasını kontrol ederim. Geliştiricilerim bunu kontrol et ve ya global ortamı güncellemek için geliştirilmekte olan ürünlerden "npm-setup.js" ile ya da "npm install" ile çalıştır. Her şey 5 dakika sürer.
Ayrıca, yeni bir geliştiricinin ortamını yapılandırmak için, önce yalnızca Windows için NodeJS ve GIT'i yüklemeli, bilgisayarlarını yeniden başlatmalı, "Paylaşılan Dosyalar" klasörünü ve geliştirilmekte olan ürünleri kontrol etmeli ve çalışmaya başlamalıdırlar.
.NET ürünü için "package.json" yüklemeden önce bu komut dosyasını çağırır:
{
"name" : "Books",
"description" : "Node (npm) configuration for Books Database Web Application Tools",
"version" : "2.1.1",
"private" : true,
"scripts":
{
"preinstall" : "node ../../SharedFiles/npm-setup.js links",
"postinstall" : "bower install"
},
"dependencies": {}
}
notlar
Komut dosyası başvurusunun Windows ortamında bile eğik çizgi gerektirdiğini unutmayın.
"npm ls" yerel olarak bağlı olan tüm paketler için "package.json" "bağımlılıklarında" listelenmediği için "npm ERR! extraneous:" mesajları verecektir.
Düzenle 1/29/16
Yukarıdaki güncellenmiş npm-setup.js
komut dosyası aşağıdaki gibi değiştirilmiştir:
İçindeki "version" var packages
paketi artık npm install
komut satırına iletilen "package" değeridir . Bu, kayıtlı depodan başka bir yerden paketlerin yüklenmesine izin verecek şekilde değiştirildi.
Paket zaten yüklüyse ancak istenen paket değilse, varolan paket kaldırılır ve doğru paket yüklenir.
Bilinmeyen nedenlerden dolayı, npm, bir yükleme veya bağlantı gerçekleştirirken periyodik olarak bir EBUSY hatası (-4082) atar. Bu hata yakalanır ve komut yeniden yürütülür. Hata nadiren ikinci kez olur ve her zaman temizlenir.
"preferGlobal": true
bir modül için package.json içinde ayarlayabilirsiniz .