【问题标题】:MSDeploy fails to deploy manually zipped packageMSDeploy 无法手动部署压缩包
【发布时间】:2014-12-23 19:00:28
【问题描述】:

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

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

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

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

如何在 C#/F# 中使用 windows zip archiver 压缩文件?我试过使用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.

知道如何正确压缩和部署项目吗?

【问题讨论】:

  • 我也有同样的问题
  • @FredericTorres 我最终使用-dest:contentPath 而不是压缩包部署了整个目录。

标签: c# msbuild zip web-deployment msdeploy


【解决方案1】:

我遇到了这个确切的问题。我有一堆 msdeploy 包,需要在打包后但在部署前更新一些文件。

如果我使用 msdeploy sync 来提取包,则会处理参数 - 这不好,它们只是占位符,直到我知道目标环境。所以我需要解压缩包,然后进行更改……到目前为止一切顺利。

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

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

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

【讨论】:

  • 请注意使用 * 示例中的细微差别(单个星号和非星号点星号)!至少在使用 7za.exe 而不是 7z.exe 时,您需要使用 *(而不是星号点星号),否则创建的存档将无法与 msdeploy 一起使用,显然是由于缺少一些目录标志,尽管存档在表面。
【解决方案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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 2012-09-27
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多