TFS2008递归复制文件并不总是有效(编译vs2003)(AfterCompile目标)
Posted
技术标签:
【中文标题】TFS2008递归复制文件并不总是有效(编译vs2003)(AfterCompile目标)【英文标题】:TFS2008 recursively copying files not always works (compiling vs2003) (AfterCompile target) 【发布时间】:2009-03-06 19:07:23 【问题描述】:在没有 SP1 的 TFS2008 中,我在自定义脚本中复制文件时遇到了一些奇怪的问题,我必须多次运行构建才能复制文件(大部分时间是在我获得文件的第二次构建中) ,让我告诉你细节:
这发生在 ASP 网站和 VS2003 Web 解决方案中,(vs2008 解决方案还可以) 在 ASP 中,我有一个虚拟 2008 解决方案,构建编译这个虚拟,我覆盖 AfterCompile 并在那里我将所有文件复制到放置位置 在 VS 2003 中我也有一个 dummy 2008 解决方案,构建首先编译 dummy,我覆盖 AfterCompile,使用“Exec”和“Command”来编译 2003 解决方案,然后将文件复制到放置位置。
正如您所见,这两种方法都很相似,我的构建本身没有问题,我的问题可以通过两种方式重现(是的,我确实签出、更新、签入然后测试构建) :
新建一个构建,配置脚本,第一次运行构建,bin文件夹中的一些DLL没有复制,第二次运行构建,我得到了所有文件。
构建已经配置并运行 OK,添加一些文件到项目中(这主要发生在 ASP 站点上),运行构建,不要得到这个新文件,再次运行构建,我得到这个新文件文件。
这是我的一个 VS2003 Web 解决方案的构建脚本作为示例
<PropertyGroup>
<TasksPath>D:\BuildTools\</TasksPath>
<VS2003Devenv>D:\Archivos de programa\Microsoft Visual Studio .NET 2003\Common7\IDE\devenv.com</VS2003Devenv>
<VS2003VirtualFolder>CnbvPifWeb</VS2003VirtualFolder>
<VS2003Suba>Cnbv.Pif.Web</VS2003Suba>
<VS2003Project>Cnbv.Pif.Web</VS2003Project>
<VS2003WebSiteName>Sitio Web predeterminado</VS2003WebSiteName>
<VS2003Configuration>Release</VS2003Configuration>
<VS2003Branch>Desarrollo</VS2003Branch>
<VS2003RelativePath>$(SolutionRoot)\$(VS2003Branch)\$(VS2003Suba)\</VS2003RelativePath>
<VS2003SolutionPath>$(VS2003RelativePath)Cnbv.Pif.Web.sln</VS2003SolutionPath>
<VS2003LocalFolder>$(VS2003RelativePath)Sources\$(VS2003Project)\</VS2003LocalFolder>
<VS2003Output>$(BinariesRoot)\$(VS2003Project)\</VS2003Output>
<VS2003CachePath>C:\Documents and Settings\srvfoundation\VSWebCache\230-2555-CPU015\</VS2003CachePath>
<VS2003ProjectExtension>vbproj</VS2003ProjectExtension>
<VS2003CacheFile>$(VS2003CachePath)$(VS2003VirtualFolder)\_vti_pvt\$(VS2003Project).$(VS2003ProjectExtension).cache</VS2003CacheFile>
</PropertyGroup>
<Import Project="$(TasksPath)Microsoft.Sdc.Common.tasks"/>
<UsingTask TaskName="Microsoft.Sdc.Tasks.Web.WebSite.CreateVirtualDirectory" AssemblyFile="Microsoft.Sdc.Tasks.dll" />
<UsingTask TaskName="Microsoft.Sdc.Tasks.Web.WebSite.DeleteVirtualDirectory" AssemblyFile="Microsoft.Sdc.Tasks.dll" />
<ItemGroup>
<!--list of ouput files, excluding .DLL outside bin and some other files-->
<VS2003OutputFiles
Include="$(VS2003LocalFolder)**\*.*"
Exclude="$(VS2003LocalFolder)**\*.vb;$(VS2003LocalFolder)**\*.cs;$(VS2003LocalFolder)**\*.resx;$(VS2003LocalFolder)**\*.vspscc;$(VS2003LocalFolder)**\*.csproj;$(VS2003LocalFolder)**\*.vbproj;$(VS2003LocalFolder)**\*.scc;$(VS2003LocalFolder)**\*.webinfo;$(VS2003LocalFolder)**\*.snk;$(VS2003LocalFolder)**\*.dll;$(VS2003LocalFolder)**\*.exe;" />
<!-- copy dll to bin folder -->
<VS2003OutputBinFiles
Include="$(VS2003LocalFolder)bin\*.dll"/>
</ItemGroup>
<Target Name="AfterCompile">
<Message Text="Deleting cache file" />
<Microsoft.Build.Tasks.Delete
Condition="Exists('$(VS2003CacheFile)')"
Files="$(VS2003CacheFile)" />
<Message Text="Creating virtual folder $(VS2003VirtualFolder) in IIS in local path $(VS2003LocalFolder)" />
<Web.WebSite.CreateVirtualDirectory
VirtualDirectoryName="$(VS2003VirtualFolder)"
Path="$(VS2003LocalFolder)"
WebSiteName="$(VS2003WebSiteName)" />
<Message Text="Compiling $(VS2003Project) in $(VS2003Branch)" />
<Exec
Command=""$(VS2003Devenv)" "$(VS2003SolutionPath)" /build $(VS2003Configuration) /out "$(VS2003LocalFolder)$(VS2003Project).log" "/>
<Message Text="Eliminando la carpeta virtual $(VS2003VirtualFolder) en IIS" />
<Web.WebSite.DeleteVirtualDirectory
WebSiteName="$(VS2003WebSiteName)"
VirtualDirectoryName="$(VS2003VirtualFolder)" />
<MakeDir Condition="!Exists('$(VS2003Output)')" Directories="$(VS2003Output)" />
<Message Text="Copying output files @(VS2003OutputFiles)" />
<Copy
SourceFiles="@(VS2003OutputFiles)"
DestinationFiles="@(VS2003OutputFiles->'$(VS2003Output)%(RecursiveDir)%(Filename)%(Extension)')"
/>
<MakeDir Condition="!Exists('$(VS2003Output)bin\')" Directories="$(VS2003Output)bin\" />
<Message Text="Copying DLL to bin folder @(VS2003OutputBinFiles)" />
<Copy
SourceFiles="@(VS2003OutputBinFiles)"
DestinationFiles="@(VS2003OutputBinFiles->'$(VS2003Output)bin\%(Filename)%(Extension)')"
/>
<OnError ExecuteTargets="VS2003Fail" />
</Target>
<Target Name="VS2003Fail">
<Message Text="Copying log file $(VS2003RelativePath)$(VS2003Project).log" />
<Copy Condition="Exists('$(VS2003RelativePath)$(VS2003Project).log')" SourceFiles="$(VS2003RelativePath)$(VS2003Project).log" DestinationFolder="$(DropLocation)\$(BuildNumber)" />
<CallTarget ContinueOnError ="true" Targets ="CreateWorkItemWhenPartialSucceed" />
</Target>
<Target
Name="CreateWorkItemWhenPartialSucceed"
Condition=" '$(SkipWorkItemCreation)'!='true' and '$(IsDesktopBuild)'!='true' ">
<Message Text="ejecutando work" />
<PropertyGroup>
<WorkItemTitle>$(WorkItemTitle) $(BuildNumber)</WorkItemTitle>
<BuildLogText>$(BuildlogText) <ahref='file:///$(DropLocation)\$(BuildNumber)\BuildLog.txt'>$(DropLocation)\$(BuildNumber)\BuildLog.txt</a >.</BuildLogText>
<ErrorWarningLogText Condition="!Exists('$(MSBuildProjectDirectory)\ErrorsWarningsLog.txt')"></ErrorWarningLogText>
<ErrorWarningLogText Condition="Exists('$(MSBuildProjectDirectory)\ErrorsWarningsLog.txt')">$(ErrorWarningLogText) <a href='file:///$(DropLocation)\$(BuildNumber)\ErrorsWarningsLog.txt'>$(DropLocation)\$(BuildNumber)\ErrorsWarningsLog.txt</a >.</ErrorWarningLogText>
<WorkItemDescription>$(DescriptionText) %3CBR%2F%3E $(BuildlogText) %3CBR%2F%3E $(ErrorWarningLogText)</WorkItemDescription>
</PropertyGroup>
<CreateNewWorkItem
TeamFoundationServerUrl="$(TeamFoundationServerUrl)"
BuildUri="$(BuildUri)"
BuildNumber="$(BuildNumber)"
Description="$(WorkItemDescription)"
TeamProject="$(TeamProject)"
Title="$(WorkItemTitle)"
WorkItemFieldValues="$(WorkItemFieldValues)"
WorkItemType="$(WorkItemType)"
ContinueOnError="true" />
</Target>
当我在日志中看到这条消息的输出时
<Message Text="Copying DLL to bin folder @(VS2003OutputBinFiles)" />
第一次我只看到一个文件的名称,第二次它打印所有正确的文件,同样的情况发生在 ASP 站点上,如果我添加一个文件,我会在第二次构建的输出中看到该文件.
希望您能帮我解决这个问题,非常感谢。
胡安·扎穆迪奥
【问题讨论】:
不知何故这被标记为untagged所以作为ongoing cleanup的一部分,我添加了似乎合适的标签。如果这些不是适当的标签,请编辑并修复。 【参考方案1】:这是OsirisJakob tfs 论坛中的答案
问题是您在根级别定义项目组。这意味着在加载项目文件时会立即评估它们。您想要的是在执行 AfterCompile 目标时对它们进行评估。
由于您运行的是 TFS 2008,您可以通过将项目组移动到 AfterCompile 目标(也称为动态项目组)来解决此问题。这将导致在 AfterCompile 目标执行时评估项目组,并为您提供正确的结果。
【讨论】:
以上是关于TFS2008递归复制文件并不总是有效(编译vs2003)(AfterCompile目标)的主要内容,如果未能解决你的问题,请参考以下文章
vs2008添加TFS项目时出现以下错误,其中输入的TFS地址的有效的。用VS2010都可以这样添加
如何获得 TFS 构建以使用保存的发布配置文件预编译 Web 应用程序?