Visual studio 网络部署在发布发布期间删除 dll

Visual studio web deploy deleting dlls during release publish

我有以下执行构建和部署的 nant 脚本:

<msbuild project=".\Code\Code.sln" target="Build">
    <property name="Configuration" value="${Build.Configuration}" />
    <property name="Platform" value="${build.platform}" />
    <property name="CreatePackageOnPublish" value="true" />
    <property name="DeployOnBuild" value="true" />
    <property name="DeployIISAppPath" value="Default Web Site${Web.Path}" />
</msbuild>

<exec program=".\Code\CodeWeb\obj${Build.Configuration}\Package\CodeWeb.deploy.cmd" commandline="/y /m:webhost.mycompany.com /u:DOMAIN\user /p:password"/>

我的问题是:当我在调试或 RC 构建配置中部署时,一切正常。所有文件都存在于发布目录中,并且代码已更新。但是,当我在发布配置中部署时,发布过程删除了我的网站运行所需的三个 .dll。

同样的代码正在为所有构建配置构建和发布,所以我认为这不是问题所在。另外,我不知道我的任何发布配置文件是否是问题的根源,但如果是的话,唯一明显的区别是 Production.pubxml.user 包含一个 <ItemGroup> 元素和一大堆 <File> 子元素列出 Development.pubxml.user 不包含任何文件的文件。但是,我将 <ItemGroup> 从 Production.pubxml.user 复制到 Development.pubxml.user 并且它没有破坏开发发布过程。

我的 msdeploy.exe 生产发布日志是这样开始的

SetParameters from:
"C:\Shared\Code\CodeWeb\obj\Release\Package\CodeWeb.SetParameters.xml"
You can change IIS Application Name, Physical path, connectionString
or other deploy parameters in the above file.
-------------------------------------------------------
 Start executing msdeploy.exe
-------------------------------------------------------
 "C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" -source:package='C:\Shared\Code\CodeWeb\obj\Release\Package\CodeWeb.zip' -dest:auto,computerName="webhost.mycompany.com",userName="DOMAIN\user",password="password",includeAcls="False" -verb:sync -disableLink:AppPoolExtension -disableLink:ContentExtension -disableLink:CertificateExtension -setParamFile:"C:\Shared\Code\CodeWeb\obj\Release\Package\CodeWeb.SetParameters.xml" 
Info: Using ID '52641dbe-b1e5-4ff5-9962-01386a7fe513' for connections to the remote server.
Info: Deleting file (Default Web Site\CodeStaging\bin\System.Net.Http.Formatting.dll).
Info: Deleting file (Default Web Site\CodeStaging\bin\System.Web.Http.dll).
Info: Deleting file (Default Web Site\CodeStaging\bin\System.Web.Http.WebHost.dll).

在开发发布中,它只是不删除这些文件。我已经比较了 .deploy.cmd 文件 msbuild 生成的文件以及在 .deploy.cmd 文件部署的 .zip 包上完成的文件夹级比较,但我似乎找不到任何值得一提的差异。

经进一步调查,只有在我从我的生产机器上构建 msdeploy 包时,这些文件才会被删除。如果我在我的生产和开发机器上检查 t运行k/ 和 运行 下面的构建和部署代码,从开发机器部署到任何环境都可以正常工作,并且从生产机器部署到任何环境机器删除了我需要的程序集。某处是否有一些全局 msdeploy 设置搞砸了?另外,如果你能回答这个问题,或许可以看看我的 other, similar one.

任何人都可以解释为什么相同的代码在我的生产机器 运行 时会破坏我的部署,但如果在我的开发机器 运行 则可以正常工作,无论我正在部署的环境如何?

这是您发布设置的一部分,

如果你去构建 |发布{项目名称}

这将打开一个对话框window

转到“设置”和“文件发布选项”,您将看到一个选项“在发布前删除所有现有文件”。如果您不希望它在部署时删除您的文件,请取消选中此选项。

我不完全确定为什么这会起作用,因为缺少的程序集不在故障机器上的 GAC 中,而是添加

<Private>True</Private>

在我的 .csproj 文件中对这些缺失程序集的每个引用下都已修复它。参考现在看起来像这样:

<Reference Include="System.Net.Http.Formatting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
  <Private>True</Private>
  <HintPath>..\packages\Microsoft.AspNet.WebApi.Client.4.0.20710.0\lib\net40\System.Net.Http.Formatting.dll</HintPath>
</Reference>

感谢 http://bronumski.blogspot.com/2009/06/project-reference-fun-and-games.html