使用MSDeploy替换archive.xml含点XML属性及部署Azure Functions问题
我之前在部署Function Bot这类Azure Functions应用时,也碰到过手动构建MSDeploy包的需求,下面是一套亲测可行的步骤,同时会解决你提到的archive.xml中带点属性的替换问题:
一、手动构建MSDeploy包的核心步骤
1. 准备项目发布文件
先把你的.NET Core Azure Functions项目编译并发布到本地目录,比如通过dotnet publish -c Release命令,拿到bin/Release/netX.X/publish下的所有输出文件。
2. 搭建MSDeploy包的基础结构
创建一个临时工作目录(比如msdeploy-workspace),并按以下结构组织文件:
msdeploy-workspace/ ├─ Content/ # 存放项目发布的所有文件 ├─ archive.xml # MSDeploy包的元数据配置 └─ parameters.xml # 部署时可替换的参数配置
把第一步拿到的发布文件全部复制到Content文件夹中。
3. 编写archive.xml配置
这个文件定义了包的内容和元数据,针对Azure Functions,你可以参考以下模板:
<archive> <metadata> <entry name="ProviderPath" value="Content" /> <entry name="CreationDate" value="2024-05-20T12:00:00Z" /> <!-- 如果有带点的属性,比如项目名称包含点 --> <entry name="My.Project.Name" value="FunctionBotDemo" /> </metadata> <items> <item type="contentPath" path="Content" /> </items> </archive>
4. 生成MSDeploy包
使用msdeploy命令行工具生成最终的zip包,命令示例:
msdeploy.exe -verb:sync ^ -source:contentPath="C:\path\to\msdeploy-workspace\Content" ^ -dest:package="C:\path\to\output\function-bot-package.zip" ^ -declareParamFile:"C:\path\to\msdeploy-workspace\parameters.xml" ^ -enableRule:DoNotDeleteRule
注意:
-enableRule:DoNotDeleteRule可以避免部署时删除Azure上已有的其他文件,适合Function Bot这类需要保留系统文件的场景。
二、解决archive.xml中带点属性的替换问题
如果需要在部署时动态替换archive.xml中带点的属性(比如My.Project.Name),需要在parameters.xml中用特殊的XPath语法来定位:
1. 在parameters.xml中定义参数
<parameters> <parameter name="Project Full Name" description="Full name of the function bot project" defaultValue="FunctionBotDemo"> <parameterEntry kind="XmlFile" scope="\\archive.xml$" match="/archive/metadata/entry[@*[local-name()='name']='My.Project.Name']/@value" /> </parameterEntry> </parameters>
这里的关键是用@*[local-name()='name']='My.Project.Name'来匹配带点的属性名,而不是直接写@name='My.Project.Name'(XPath会把点解析为节点分隔符)。
2. 部署时替换参数
在ARM模板中引用这个MSDeploy包时,可以通过parameters节点传入替换值:
{ "resources": [ { "type": "Microsoft.Web/sites", "name": "[variables('functionAppName')]", "apiVersion": "2022-03-01", "properties": { "siteConfig": { "appSettings": [] } }, "resources": [ { "type": "extensions", "name": "msdeploy", "apiVersion": "2022-03-01", "dependsOn": [ "[resourceId('Microsoft.Web/sites', variables('functionAppName'))]" ], "properties": { "packageUri": "[parameters('packageBlobUrl')]", "parameters": { "Project Full Name": "[parameters('projectFullName')]" } } } ] } ] }
三、验证包的有效性
生成包后,可以用以下命令查看包的内容和参数配置,确保没有问题:
msdeploy.exe -verb:dump -source:package="C:\path\to\function-bot-package.zip"
内容的提问来源于stack exchange,提问作者Devedse

