3

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

AppName
AppName_Package

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

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

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

但是,在部署包时,AppName.dll缺少 Web 应用程序 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,并且bin在包创建过程中仅从目录中删除了一些其他(引用的)DLL(但不是全部 - 可能是 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>

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

4

1 回答 1

4

这里的问题是 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 方法更好。你能试试看,让我知道你发现了什么吗?

于 2012-09-11T17:45:34.403 回答