Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
在我以前的一个文章中,我描述和演示了如何在Node.js和Windows Azure Web Site (WAWS)使用NPM包。在那篇文章中我使用NPM命令安装软件包,然后使用Git为Windows提交我所做的更改,并且同步它们到WAWS
git 资源库。然后WAWS将触发新的部署托管我的WAWS git 资源库应用程序。
有人可能会注意到,NPM包可能包含多个文件,而且可能有点大。例如,"azure"包,Windows Azure SDK是Node.js的包,大约6 MB。另外一个常用的含有给Node.js使用的MVC框架包”express”,大约是1MB。当我首次将节点放到Windows
Azure时,所有的节点必须上载到云。
是否可能让Windows Azure为我们下载并安装这些包?在这篇文章中,我将演示在部署时如何使 WAWS 为我们安装所有需要的包。
让我们开始演示
演示是最直接的。让我们创建一个新的WAWS并把它复制到我的当地磁盘。为Windows拖动文件夹到Git,以至于我们可以提交和发送。
如果你不熟悉怎样使用Windows 的Windows Azure Web Site、Git部署、git副本和Git,请参考这篇文章。
然后打开命令窗口,在我们的代码文件夹中安装一个包。我们说我想要安装“express”。
然后创建一个新的Node.js文件,命名为“server.js”,并粘贴如下代码。
var express = require("express");
var app = express();
app.get("/", function (req, res) {
res.send("Hello Node.js and Express.");
});
console.log("Web application opened.");
app.listen(process.env.PORT);
假如现在我们切换到Windows的Git,我们将会发现他它检测到我们所做的更改,其中包括“server.js”和“node_modules”文件夹下的所有文件。我们需要上传的只是我们的源代码,但是这个巨大的包文件也必须被上传。现在我将演示如何排除它,并且在云上让Windows Azure安装包。
首先我们需要添加一个名为“.gitignore”的特殊文件。由于这个文件仅仅包含扩展名,它似乎不能直接从文件浏览器添加。因此我们需要从命令行添加。导航到本地资源库的文件夹,并执行下面的命令来创建一个名为“.gitignore”的空文件夹。假如命令窗口要求输入,只需要按下Enter键。
echo > .gitignore
现在打开此文件,复制下面的内容并保存。
node_modules
现在如果我们切换到Windows 的 Git,我们将会发现在“node_modules”下的包没有在更改列表中。
所以现在我们提交和发送,“express”包将会被加载到Windows Azure。
其次,在部署时让我们告诉Windows Azure哪个包需要安装。创建另一个名为“package.json”的文件,复制下面的内容到文件并保存。
{
"name": "npmdemo",
"version": "1.0.0",
"dependencies":
{
"express": "*"
}
}
现在返回到Windows的Git,提交我们的更改,并将它发送到WAWS。
然后让我们在开发人员门户中打开WAWS,我们将看到一个新的部署被完成。单击部署右侧的箭头,我们能够发现WAWS如何处理此部署。特别是我们发现被NPM执行的WAWS。
假如我们打开日志,我们可以看到安装包WAWS执行的指令和安装输出信息。正如您从云端看到WAWS为我安装的“express”,因此我们不需要将所有堆的包上传到Azure.
打开此网站,我们可以看到结果。这证明“express”已经被成功安装。
下面发生了什么?
现在让我们来解释“.gitignore” 和“package.json”的意思。
“.gitignore”是git库的一个忽略配置文件。所有列在“.gitignore”中的文件和文件夹将从git发送中跳过。在下面的事例中,我复制“node_modules”到本地存储库中的文件。这意味着,不跟踪和上传“node_modules”文件夹下的所有文件。因此通过使用“.gitignore”,从上传到Windows Azure我跳过了所有的包。
“.gitignore”可以包含文件和文件夹。它还可以包含我们不想忽略的文件和文件夹。在下一章中,我们将会看到如何使用不被忽略的语法使SQL包含在内。
“package.json”文件是Node.js应用程序的包定义文件。我们可以在“package.json”文件中以JSON格式定义应用程序名、版本、描述、作者等信息。我们也可以放置相互依赖的包,指示哪个包是Node.js需要的。
在WAWS中,名称和版本是必要的。当部署发生时,WAWS将查找此文件,找到依赖包,并执行NPM命令逐个安装。因此在上面的演示中,我复制“express”到这个文件,以至于WAWS将会为我自动安装它。
我手动更新“package.json”文件的依赖项部分。但是这可以部分自动完成。假如在本地的存储库中我们有有效的“package.json”,当我们安装包时,我们可以在“npm install”命令中指定“--save”参数。以至于NPM帮助我们更新依赖项部分。
例如,当我们想要安装“azure”,我们应该执行下面的命令。注意,我添加了“--save”命令。
npm install azure --save
一旦它完成,我的“package.json”将会自动更新。
这里将介绍每个依赖的包。当值是版本范围时,JSON键值是包名。以下是版本范围格式的简明列表。有关“package.json”的详细信息,请参阅此处。
格式 |
说明 |
示例 |
版本 |
版本必须完全匹配。 |
"azure":"0.6.7" |
> = 版本 |
必须等于或大于版本。 |
"azure":"> 0.6.0" |
1.2.x |
版本号必须从提供的数字开始,任何数字可以代替 x。 |
"azure":"0.6.x" |
~ 版本 |
版本必须至少和系列一样,它必须小于以上范围的下一个重大修订。 |
"azure":"~ 0.6.7" |
* |
匹配任何版本。 |
"azure":"*" |
基于您在此处的定义WAWS将安装合适版本的包。WAWS git部署和NPM安装也是如此。
但是一些包...
我们知道,当我们在“package.json”中指定依赖项,WAWS将下载并安装它们到云上。对于大多数包,它运行正常。但有一些特殊的包可能不能运行。假如包安装需要一些特殊的环境约束它,这意味着它可能失败。
例如,当NPM安装期间,Node.js包的SQL
Server驱动程序需要“node-gyp”、Python和 C++ 2010被安装在目标机器上。假如我们仅仅把“msnodesql”放在“package.json”文件中,并将它发送到WAWS,由于在WAWS虚拟机中没有“node-gyp”、 Python和 C++ 2010,部署将会失败 。
例如,“server.js”文件。
var express = require("express");
var app = express();
app.get("/", function(req, res) {
res.send("Hello Node.js and Express.");
});
var sql = require("msnodesql");
var connectionString = "Driver={SQL Server Native Client 10.0};
Server=tcp:tqy4c0isfr.database.windows.net,1433;Database=msteched2012;
Uid=shaunxu@tqy4c0isfr;Pwd=P@ssw0rd123;Encrypt=yes;Connection Timeout=30;";
app.get("/sql", function (req, res) {
sql.open(connectionString, function (err, conn) {
if (err) {
console.log(err);
res.send(500, "Cannot open connection.");
}
else {
conn.queryRaw("SELECT * FROM [Resource]", function (err, results) {
if (err) {
console.log(err);
res.send(500, "Cannot retrieve records.");
}
else {
res.json(results);
}
});
}
});
});
console.log("Web application opened.");
app.listen(process.env.PORT);
“package.json”文件。
{
"name": "npmdemo",
"version": "1.0.0",
"dependencies":
{
"express": "*",
"msnodesql": "*"
}
}
他部署到WAWS失败。
从NPM日志中,我们可以看到因为“msnodesql”它不能被安装在WAWS上。
在“.gitignore”文件中我们应该忽略所有的包,除了“msnodesql”,并且我们自己上传包,这就是解决方案。这个可以通过使用下面的内容做到。首先我们不要忽略“node_modules”文件夹。然后我们忽略所有的子文件夹,但是需要git检查每个子文件夹,然后我们不要忽略名为“msnodesql”子文件夹,这个就是SQL Server Node.js驱动程序。
!node_modules/
node_modules/*
!node_modules/msnodesql
有关“.gitignore”语法的更多信息,请参阅这篇文章。
现在假如我们转到Windows的Git,我们将会发现“msnodesql”被列入未提交集,然而“express”没有被列入。此外我也需要从“package.json”中删除“msnodesql”的依赖。
提交并发送到WAWS。现在我们可以看到部署被成功完成。
通过我们上传的 “msnodesql”包,我们可以使用来自Node.js应用程序的Windows Azure SQL Database。
总结
在这篇文章中,我演示在发布操作期间如何利用Windows Azure Web Site的部署进程进行安装NPM包。使用“.gitignore”文件和“package.json”文件我们可以忽视来自Node.js的依赖包,并让Windows
Azure Web Site在部署时下载和安装它们。
某些特殊的包不能被Windows Azure Web Site安装,例如“msnodesql”,我们也可以把它们放在发布有效载荷中。
Windows Azure Web Site、Node.js 和 NPM的结合,它使我们更容易和快捷地开发和部署Node.js应用程序到云。
希望这个有所帮助,
Shaun
本文翻译自: