我正在使用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上开始构建输出一些东西:
来自TFS的源输出到源目录(SourceDir)
构建的输出分为两个文件夹
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>
某处。
我很感激你可以把我引导到任何现有的资源,已经解释了这一点,我应该能够解决这个问题并让它发挥作用。或者,如果在这里告诉我这么容易。
答案 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方法更好。你可以尝试一下,让我知道你发现了什么吗?