MSDeploy无法手动部署压缩包

时间:2014-12-23 19:00:29

标签: c# msbuild zip web-deployment msdeploy

之前我使用msbuild.exe构建和部署Web项目

现在我想在部署之前修改一些文件,所以我使用msbuild创建一个.zip包,然后解压缩,修改一些文件然后再次压缩并尝试使用msdeploy进行部署。

问题是,部署空文件夹。当我尝试部署未修改的.zip包时 - 它工作正常。

经过长时间的挖掘,我发现,msdeploy不支持使用内置的Windows zip存档器之外的压缩包。

如何在C#/ F#中使用Windows zip归档文件压缩文件?我尝试使用System.IO.Compression.ZipFile.CreateFromDirectory方法,但msdeploy仍然部署空文件夹。

这是我在尝试部署软件包时得到的警告:

Warning: Skipping source dirPath (C:\TeamCity\buildAgent\MyPath) because of rule SkipInvalidSource.
The Zip package 'C:\TeamCity\buildAgent\MyPath\MyPackage.zip' could not be loaded.

当我禁用SkipInvalidSource规则时,我收到以下错误:

Error: (12/23/2014 6:56:44 PM) An error occurred when the request was processed on the remote computer.
Error: Object reference not set to an instance of an object.
   at Microsoft.Web.Deployment.DeploymentSyncEnumerable.<Create>d__0.MoveNext()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at Microsoft.Web.Deployment.DeploymentSyncContext.SyncChildrenNoOrder(DeploymentObject dest, DeploymentObject source)
   at Microsoft.Web.Deployment.DeploymentSyncContext.SyncChildrenNoOrder(DeploymentObject dest, DeploymentObject source)
   at Microsoft.Web.Deployment.DeploymentSyncContext.SyncChildrenOrder(DeploymentObject dest, DeploymentObject source)
   at Microsoft.Web.Deployment.DeploymentSyncContext.ProcessSync(DeploymentObject destinationObject, DeploymentObject sourceObject)
   at Microsoft.Web.Deployment.DeploymentObject.SyncToInternal(DeploymentObject destObject, DeploymentSyncOptions syncOptions, PayloadTable payloadTable, ContentRootTable contentRootTable, Nullable`1 syncPassId, String syncSessionId) at Microsoft.Web.Deployment.DeploymentAgent.HandleSync(DeploymentAgentAsyncData asyncData, Nullable`1 passId)
Error count: 1.

有关如何正确压缩和部署项目的任何想法吗?

3 个答案:

答案 0 :(得分:8)

我遇到了这个问题。我有一堆msdeploy软件包,需要在包装后更新一些文件,但需要预先部署。

如果我使用msdeploy同步来提取包,那么参数就会被处理 - 这没有好处,它们只是占位符,直到我知道哪个环境是目标。所以我需要解压缩包然后进行更改......到目前为止一切都很好。

然后我把它全部重新压缩。然后我得到了这个问题:msdeploy不会处理包含的文件夹。如果我使用msdeploy来处理提取的文件,我再次丢失参数......或者更确切地说,它们会从paramters.xml文件中过早处理。 GRR。

解决方案?使用7zip ...或标准Windows拉链以外的任何东西。

e.g。 7z.exe a -r C:\deploys\mypackage.zip C:\extractedstuff\*

答案 1 :(得分:2)

不要使用zip存档。 您必须调用msdeploy.exe。

bat-file示例:

msdeploy.exe -verb:sync ^
-source:archiveDir="C:\YourAbsolutePathToTheFolderContaining_Content_DirAnd_XMLs" ^
-dest:package="ArchName.zip" ^
-declareParam:name="IIS Web Application Name",defaultValue="Default Web Site/AppName",tags="IisApp" ^
-declareParam:name="IIS Web Application Name",type="ProviderPath",scope="IisApp",match="^.*PackageTmp$" ^
-declareParam:name="IIS Web Application Name",type="ProviderPath",scope="setAcl",match="^.*PackageTmp$"

有关详情,请查看帮助:

msdeploy -help -dest
msdeploy -help -declareParam

等。另请参阅 parameters.xml

答案 2 :(得分:0)

Dan Kendall的回答对我有所帮助,但最终我不需要使用7Zip。我更喜欢这种方式,因为这样我就不需要在构建服务器上安装7Zip。

答案很简单,我只是从使用Zip切换到Archive Files

enter image description here