MSDeploy无法部署手动压缩的软件包

10

之前我使用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.

有没有什么想法可以正确地压缩和部署项目?

我遇到了同样的问题。 - Frederic Torres
1
@FredericTorres 我最终使用 -dest:contentPath 部署了整个目录,而不是压缩包。 - user4228370
3个回答

11

我曾遇到过这个问题。我有一堆msdeploy包,需要在打包后但部署前更新其中的某些文件。

如果我使用msdeploy同步提取包,参数会被处理掉——这是不好的,因为它们只是占位符,直到我知道要针对哪个环境。所以我需要先解压缩包然后进行更改......目前为止还好。

但是当我重新压缩它们之后,就会出现以下问题:msdeploy无法处理包含的文件夹。如果我使用msdeploy处理提取出来的文件,一样会失去参数......或者说它们会从parameters.xml文件中过早地被处理掉。真是让人恼火。

解决办法?使用7zip......或者除了标准Windows压缩工具之外的任何其他工具。

例如, 7z.exe a -r C:\deploys\mypackage.zip C:\extractedstuff\*


1
请注意在使用(单个星号而不是星号点星号)的示例中的微妙差别!至少在使用7za.exe而不是7z.exe时,您需要使用(而不是星号点星号),否则创建的存档将无法与msdeploy一起使用,显然由于缺少某些目录标志,尽管表面上看存档相同。 - tholesen

2

不要使用zip压缩工具,你必须调用msdeploy.exe。

bat文件示例:

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


0

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

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

enter image description here


“归档文件”任务在Windows上内部使用7z:https://github.com/microsoft/azure-pipelines-tasks/blob/master/Tasks/ArchiveFilesV2/archivefiles.ts - Stijn De Vos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接