【问题标题】:MSDeploy Package has Missing FilesMSDeploy 包缺少文件
【发布时间】:2012-07-28 09:21:13
【问题描述】:

我正在使用 MSBuild 构建 Web 应用程序项目并添加参数以创建包文件。这一切都很好。我在_PublishedWebSites 输出中有两个文件夹:

AppName
AppName_Package

ApplicationName 文件夹中,整个网站都在那里,我可以简单地将这个文件夹复制到网站上,它就会运行。

在 Package 文件夹中,我得到了预期的 5 个文件:

AppName.deploy.cmd
AppName.-readme.txt
AppName.SetParameters.xml
AppName.SourceManifest.xml
AppName.zip

但是,在部署包时,缺少 Web 应用程序 dll (AppName.dll),以及其他一些重要的引用依赖项。

检查包本身确实会发现这些文件实际上已从 Web 应用程序bin 目录中丢失。

这很奇怪,考虑到文件都在根 AppName 文件夹中,但不在 AppName_Package 文件夹中的包中。

我所做的唯一与 MSDeploy 相关的修改是我将覆盖 CopyAllFilesToSingleFolderForPackageDependsOn 目标以从库项目中复制一些处理程序,这一切都很好。

<PropertyGroup>
    <CopyAllFilesToSingleFolderForPackageDependsOn>
        CustomCollectFiles;
        $(CopyAllFilesToSingleFolderForPackageDependsOn);
    </CopyAllFilesToSingleFolderForPackageDependsOn>
</PropertyGroup>
<Target Name="CustomCollectFiles">
    <ItemGroup>
        <_CustomFiles Include="..\Libraries\CodeLibrary1\**\*.ashx" />
        <FilesForPackagingFromProject  Include="%(_CustomFiles.Identity)">
            <DestinationRelativePath>$(ProjectDir)%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
        </FilesForPackagingFromProject>
    </ItemGroup>
</Target>

因此,我无法确定为什么 Web 应用程序的 DLL,并且在包创建过程中只有少数其他(引用的)DLL 从 bin 目录中删除(但不是全部 - 可能是 3%)。

我应该在日志文件中寻找什么?

编辑:(对赛义德的回应):

非常感谢您回答我的帖子。不幸的是,我不确定我们是否在同一页面上。就像我说的,我可能没有很好地解释我的问题,无法真正让其他人了解我的问题到底是什么。让我再澄清一次

将外部文件复制到我的 Web 应用程序中不是问题。我知道浏览我的帖子并看到非常常见的“CopyAllFilesToSingleFolderForPackageDependsOn”元素会引发一些危险信号、警报、铃声和口哨声。 。这似乎是人们正在努力解决的一个常见问题,正如您所指出的,它的执行存在一些问题。这对我来说没问题。

我的问题更多地与项目引用的 DLL 有关,最重要的是应用程序 DLL 本身没有被复制。

今天更多的调整揭示了一些我不知道的事情。例如:

在 TFS 上开始构建会输出几件事:

  1. 来自 TFS 的源输出到源目录(SourceDir)

    • 这仅包含签入 TFS 的输出
    • 这不包括项目或文件引用,只包括在 TFS 中提交的内容
  2. 构建的输出在两个文件夹中

    • 二进制文件(包括项目和文件引用)
    • 来源(仅限 TFS 中包含/提交的内容)

在 Binaries 中,我找到了 _publishedWebsites 文件夹,以及所有项目和文件引用,而在 Sources 中,只有检入 TFS 的文件。

我的问题或困惑是,当我将以下参数传递给 MSBuild Arguments 时,它会获取构建 (_PublishedWebsites) 的输出并使用这些文件来创建包。它不这样做。

实际过程基于 SOURCES 文件夹中的文件构建一个包。所以,这是我的困境/困惑,因为我没有将我的应用程序 dll 提交到源代码中,它没有包含在包中,因此没有被发送到测试服务器上的测试站点。

/p:DeployOnBuild=True /p:DeployTarget=MsDeployPublish /p:CreatePackageOnPublish=True /p:MSDeployPublishMethod=RemoteAgent /p:MSDeployServiceUrl=http://<mytestsite> /p:DeployIisAppPath="<AppName>" /p:UserName=<domain\user> /p:Password=<mypassword> /p:SkipExtraFilesOnServer=false /p:AllowUntrustedCertificate=True

总结一下,一旦我在我的开发机器上“签出以进行编辑”我的应用程序 DLL,他们编译解决方案,最后将应用程序 DLL 提交到源代码管理,然后它被包含在包中,因为它被包含在内作为另一个源项。

所以,我想这是我的错,因为我不了解如何将 TFS BUILD 的输出放入源文件夹,并将其包含到 msdeploy 使用的包中。

可能有一些非常基本的东西我错过了或只是略过 - 并且不理解,包创建来自 Sources 文件夹而不是 _PublishedWebsites 文件夹。我也不明白如何将 MSBuild 编译的应用程序 dll 和项​​目引用的 dll 放入我的包中 - 替换源代码控制中已提交的源项目。

我希望这不是完全浪费你的时间,因为我错过了一个

source=<some-parameter>

某处。
我很感激你可以指导我找到任何现有的资源,这些资源已经解释了我应该能够理解它并让它工作的地方。或者如果在这里告诉我很容易。

【问题讨论】:

  • 问题 - 你确定日志文件中的操作顺序了吗?例如,您是否确保在部署打包之前构建了 Web 应用程序 dll?会不会是比赛条件?
  • 嗨尼克,应用程序输出实际上包括网络应用程序 dll。我确实在第 8 行解释过——也许不清楚。
  • 我不确定我们是否相互理解。我读到你的问题是说“我的 msdeploy 包不包含它应该包含的 DLL,但它们似乎内置在我的构建的输出文件夹中”我的问题是:你是否查看了 MSBuild 日志文件以确保丢失的 DLL与部署包相比,是否以正确的顺序构建?意思是,最终他们可能都在那里,但也许他们不在正确的时间。
  • 嗨尼克,感谢您的澄清。我没有查看 MSBuild 日志文件以确保以正确的顺序构建了丢失的 DLL,因为 Web 应用程序本身就是包中丢失的 DLL 之一。并且 MSDeploy 仅在构建应用程序后启动。出于某种原因 - 我试图找出原因,创建的包不包含应用程序程序集,但应用程序程序集位于创建包的输出文件夹中。 MSDeploy 获取生成的包(缺少文件)并进行部署。

标签: asp.net msbuild webdeploy microsoft-web-deploy


【解决方案1】:

这里的问题是 CopyAllFilesToSingleFolderForPackage 目标本身没有被 VS2012 目标调用。我们做了很多改变,这可能是我们这边的倒退。我会调查一下,看看是否有什么我们可以做的。幸运的是,更新它以获得您正在寻找的行为应该非常简单。而不是使用 CopyAllFilesToSingleFolderForPackageDependsOn 您应该能够使用 PipelineCollectFilesPhaseDependsOn 作为替代方案。您应该能够将上面的内容更改为

<PropertyGroup>
    <PipelineCollectFilesPhaseDependsOn>
      CustomCollectFiles;
      $(PipelineCollectFilesPhaseDependsOn);
      </PipelineCollectFilesPhaseDependsOn>    
</PropertyGroup>

<Target Name="CustomCollectFiles">
    <Message Text="Inside of CustomCollectFiles" Importance="high"/>
    <ItemGroup>
      <_CustomFiles Include="C:\Temp\_NET\WAP-AfterPublish\MvcApplication1\additional files\**\*" />

      <FilesForPackagingFromProject  Include="%(_CustomFiles.Identity)">
        <DestinationRelativePath>additional files\%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
      </FilesForPackagingFromProject>
    </ItemGroup>
</Target>

我刚刚对 VS2012 和 VS2010 都进行了尝试,所以这似乎比 CopyAllFilesToSingleFolderForPackageDependsOn 方法更好。您可以尝试一下,然后告诉我您的发现吗?

【讨论】:

  • 你好说!很抱歉跑题了,但是当我试图消除一些 WPP 标记的歧义时,我注意到您建议使用 msdeploy->webdeploy 标记同义词。您是否还可以为 webdeploy 添加“microsoft-web-deploy”同义词(反之亦然)?我自己会这样做,但我目前“缺乏所需的分数”。
猜你喜欢
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-27
  • 2020-02-21
  • 2020-10-27
  • 2012-02-09
相关资源
最近更新 更多