我已经创建了一个tfsbuild.proj文件来构建我的解决方案的发行版本,并在其中我为BuildNumberOverrideTarget创建了一个自定义目标,用于处理自定义版本控制。我将版本号存储在TFS的文件位置,自定义任务将获取版本号,检查assemblyinfo.cs文件,编辑版本详细信息,签入然后增加下一版本的版本号。
这一切都运行正常,但只有在TFS第一次构建之前,在将版本控制更改添加到tfsbuild.proj文件之前,它就好像它依赖于Sources \ directory结构已经存在于早期版本中。因此,如果您决定分支源并按原样运行构建,它将失败并出现一个奇怪的错误,如:
Target "InitializeWorkspace" skipped. Previously built successfully.
Target "BuildNumberOverrideTarget" in file "e:\tfstemp\TestProject\TestProject MainBranch Release\BuildType\TFSBuild.proj" from project "e:\tfstemp\TestProject\TestProject MainBranch Release\BuildType\TFSBuild.proj":
Task "Message"
Loading last build number from file "e:\tfstemp\TestProject\TestProject MainBranch Release\BuildType\..\Sources\Version Number\buildnumber.txt"
Done executing task "Message".
Using "Exec" task from assembly "Microsoft.Build.Tasks.v3.5, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".
Task "Exec"
Command:
"C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\PrivateAssemblies\..\tf.exe" get /force /noprompt /overwrite buildnumber.txt
e:\tfstemp\TestProject\TestProject MainBranch Release\BuildType\TFSBuild.proj(472,5): error MSB6003: The specified task executable "cmd.exe" could not be run. The directory name is invalid
Done executing task "Exec" -- FAILED.
Done building target "BuildNumberOverrideTarget" in project "TFSBuild.proj" -- FAILED.
Done Building Project "e:\tfstemp\TestProject\TestProject MainBranch Release\BuildType\TFSBuild.proj" (EndToEndIteration target(s)) -- FAILED.
Build FAILED.
经过一番研究后,我找到了以下网站,其中指出如果要覆盖内部版本号目标,则排序不正确。它建议重新指定执行顺序或将DependsOnTarget添加到BuildNumberOverrideTarget。
http://social.msdn.microsoft.com/forums/en-US/tfsbuild/thread/9103c92d-4b03-41d4-9eae-93c78cb6ea3a/
我在帖子中尝试了两个建议,但我似乎无法让它运行,构建错误似乎跳过了InitializeWorkspace。
我有一个部分有效的解决方法,但我们会看到有关工作空间不存在的分支区域的错误。我们的解决方法是使用以下对tfsbuild.proj文件的编辑在BuildNumberOverrideTarget中创建目录结构:
<Target Name="BuildNumberOverrideTarget">
<!-- Create a custom build number, matching the assembly version -->
<Message Text="Loading last build number from file "$(MSBuildProjectDirectory)\..\Sources\Version Number\buildnumber.txt"" />
<!--need to ensure that the sources folder exists-->
<PropertyGroup>
<SourcesDirectory>$(MSBuildProjectDirectory)\..\Sources\Version Number</SourcesDirectory>
</PropertyGroup>
<MakeDir Directories="$(SourcesDirectory)"/>
<Exec Command="$(TF) get /force /noprompt /overwrite buildnumber.txt"
WorkingDirectory="$(MSBuildProjectDirectory)\..\Sources\Version Number\">
</Exec>
<Exec Command="$(TF) checkout buildnumber.txt"
WorkingDirectory="$(MSBuildProjectDirectory)\..\Sources\Version Number\" IgnoreExitCode="true">
</Exec>
... rest omitted to keep short...
</Target>
在尝试运行任何自定义目标之前,有没有办法可以强制msbuild运行以自动获取整个源结构?我们正在进行发布构建,我不喜欢它可能尝试缓存旧版本的文件和文件夹结构。
非常感谢,
艾玛
答案 0 :(得分:0)
我不确定这是否适用于TFS 2008,但我能够通过设置以下依赖项来解决TFS 2010中的这个问题:
<Target Name="BuildNumberOverrideTarget" DependsOnTargets="CoreInitializeWorkspace;CoreCleanAll;CoreGet">
您需要所有3个依赖项:
CoreInitializeWorkspace
只创建工作区,但不会获取任何文件CoreGet
获取文件,这就是我们想要的内容CoreCleanAll
用于清除以前版本中的旧代码。如果我们不依赖它,那么它将在 CoreGet之后运行,并删除我们刚检出的所有代码,然后构建将失败,因为它没有编译代码:-)