MSDeploy包有丢失的文件

时间:2012-07-30 16:54:25

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

我正在使用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>

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

我想在日志文件中找到什么想法?

编辑:(对Sayed的回应):

我真的很感谢你回答我的帖子。不幸的是,我不确定我们是在同一页面上。就像我说的那样,我可能没有足够好地解释我的问题,以便真正解决其他问题。让我再试一次澄清

将外部文件复制到我的Web应用程序中不是问题。我知道扫描我的帖子并看到太常见的“CopyAllFilesToSingleFolderForPackageDependsOn”元素会引发一些红旗,警报,铃声和哨声。 。这似乎是人们正在努力的常见事情,正如你所指出的那样,它被执行时存在一些问题。这对我有用。

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

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

在TFS上开始构建输出一些东西:

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

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

    • 二进制文件(包括项目和文件引用)
    • 来源(仅限TFS中包含/承诺的内容)
  3. Inside 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的输出放到sources文件夹中,并将其包含在msdeploy使用的包中。

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

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

    source=<some-parameter>
    

    某处。
    我很感激你可以把我引导到任何现有的资源,已经解释了这一点,我应该能够解决这个问题并让它发挥作用。或者,如果在这里告诉我这么容易。

1 个答案:

答案 0 :(得分:4)

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

<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方法更好。你可以尝试一下,让我知道你发现了什么吗?