云服务是通过两个文件进行发布的,一个是cspkg,包含所有程序代码,一个是cscfg,包含配置信息。如果要在云服务的虚拟机上安装软件或者拷贝文件,简单的做法是把要装的软件和文件打包在cspkg里面,然后在csdef里面定义启动脚本,进行软件的自动化安装或者文件拷贝。下面看一个简单的例子
比如我们要把一个test.dll文件拷贝到目标虚拟机的系统目录下,而不是仅仅放在Webrole/worker role的缺省目录下,那么我们需要这样做:
首先,把这个dll放到Azure Role的代码目录内,比如web role/worker role的根目录
查看文件属性,确保生成操作为“内容”
如果当前是workerrole,还需要将待拷贝的文件复制属性改为“较新则复制”。这会让该文件复制到bin目录下,而Bin目录会成为worker role的approot。而Web role则不需要修改,因为Web role的app root就是项目根目录
此时如果我们打包该项目,然后将输出的cspkg解压缩,可以发现该文件出现在了目标role的approot目录下
接下来,我们需要让Azure进行文件的自动拷贝。打开项目的csdef文件,找到相应Role的定义,添加<startup>段落,定义拷贝命令
<WebRole name="GuestBook_WebRole" vmsize="Small"> .... .... .... <Startup> <Task commandLine="copy test.dll %windir%" executionContext="elevated" taskType="simple" /> </Startup> </WebRole>其中,executionContext是执行权限。如果是elevated,表示以管理员权限执行,如果是limited,则以普通用户权限执行
至此,我们再发布该应用,就会实现test.dll的自动拷贝。如果要安装应用程序,可以把startup定义里面的commandline换位应用的静默安装命令。一般的应用都支持静默安装,命令一般为 xxxx.exe /silent。具体参数可以通过xxxx.exe /?查询
有时候commandline没有这么简单,不能写到一行里面。此时最好单独创建一个setup.cmd脚本文件,将需要执行的命令写好。然后在startup的commandline里面写setup.cmd.该脚本文件的放置方法跟前面test.dll相同。
由于每次发布都需要上传cspkg,显然cspkg不能太大。如果要打包的安装程序或者文件太大,那么不建议把他们和cspkg打包在一起,而是事先上传到Azure的Blob存储上,然后在startup脚本里面进行文件的下载
把文件进行事先上传很简单。那么怎么在startup脚本里面进行下载呢?我们需要一个工具进行文件的下载
将这里的压缩包(http://download.csdn.net/detail/shaunfang/5390215)解压到本地Azure项目的目标Role根目录下,确保文件属性的生成操作为“内容”。如果是worker role,需要修改复制属性为“较新则复制”
这里包括几个文件,分别是Blob的客户端dll,下载和解压缩脚本等
然后,在role根目录下创建一个download.bat的文件,里面填写下载、解压缩和安装代码:
cmd /c util\wash.cmd blob download "ImageMagick-6.8.0-vc9.zip" "ImageMagick-6.8.0-vc9.zip" phpsetup filestore "xxxxxxxxxx" cscript /NoLogo util\unzip.vbs "ImageMagick-6.8.0-vc9.zip" . copy ImageMagick-6.8.0-vc9\* "%ProgramFiles(x86)%\PHP\v5.3\"其中,第一行是进行文件的下载。"ImageMagick-6.8.0-vc9.zip"是文件名,phpsetup是container名,filestore是存储账号名,最后是存储的密钥
第二行是zip解压缩
第三行是文件拷贝
之后,修改startup的commandline为download.bat即可。在正式发布服务前,可在本地先手动执行下download.bat,看看能否正确下载安装