你可以在不需要工作空间的情况下完成TFS吗?

时间:2011-01-17 11:31:56

标签: tfs tfs2010

我正在尝试将我们的构建脚本从使用SourceSafe更改为TFS,而不使用MsBuild(还)。

一个小问题是工作区目录由脚本重命名和存档,这使得TFS认为它不需要获取任何文件。即使使用 / force 标志,它也只是获取目录而不获取源文件。

我目前正在使用

TF.exe get "Product/Main/Project1"  /force /recursive /noprompt

为了节省我在脚本中管理工作区或使用中间目录,是否有人知道可以获取目录和代码而无需工作空间的命令?

5 个答案:

答案 0 :(得分:14)

如果没有工作空间,则无法运行tf get。原因是服务器需要知道服务器路径和本地路径之间的映射。

如果您正在处理大量文件,则不宜:

  1. 创建&
  2. 每次删除新工作区
  3. 或者,创建一个新工作区(然后永远不要删除它)
  4. 原因是每次执行Get时,服务器都会跟踪哪些文件下载到哪个工作区的文件。如果您从未清理这些工作区,那么存储此信息的表将随着时间的推移而增长。

    此外,如果您正在创建&在任何时候都删除工作区,服务器必须写下所有这些行,然后在完成后删除它们。这是不必要的。

    每次都应该尝试重用相同的工作区。如果这样做,服务器非常有效率,只发送自上次下载以来已更改的文件。即使您的构建从一个分支移动到另一个分支,您也可以使用tf get /remap,如果分支共享公共文件,这有时会更有效。

    虽然它无法解决您的问题,但可以在没有工作空间的情况下列出文件和下载文件。

    列出文件:

    tf dir $/Product/Main/Project1 /R
    

    下载文件:

    tf view $/Product/Main/Project1/file.cs
    

    使用广告素材批处理文件,您可以使用FOR命令将这两者结合在一起。但是我建议首先尝试解决您的工作区问题,因为这是TFS的使用方式。

答案 1 :(得分:3)

工作空间是源存储库位置和文件系统位置之间的映射,因此不能让您不使用工作空间。但是,您可以在需要时轻松设置和拆除工作区。

这是一个简单的TFS任务,用于在执行一些文本替换并将其构建到数据库更新包之前从TFS获取我的数据库源文件。您可以轻松地将其转换为当前构建脚本所需的任何语法:

<Target Name="GetDatabaseSources">
    <!-- clean out the folder before doing the fresh get of the database sources -->
    <Folder.CleanFolder Path="$(DatabaseBuildBaseLocation)" Force="true"/>

    <!-- create a workspace for the database source of the product -->
    <CallTarget Targets="CreateDatabaseSourceWorkspace" />
    <!-- get the database sources for the product -->
    <Get TeamFoundationServerUrl="$(TeamFoundationServerUrl)" Workspace="$(DatabaseSourceWorkspaceName)" Recursive="true" Version="$(DatabaseSourceVersion)" Force="true" />
    <!-- delete the workspace -->
    <Exec Command="$(Tf) workspace /delete $(DatabaseSourceWorkspaceName) /server:$(TeamFoundationServerUrl) /noprompt " ContinueOnError="true" />
</Target>

<!-- creates and maps a temporary workspace for the database source of the product -->
<Target Name="CreateDatabaseSourceWorkspace">
    <Exec Command="$(Tf) workspace /delete $(DatabaseSourceWorkspaceName) /server:$(TeamFoundationServerUrl) /noprompt " ContinueOnError="true" />
    <Exec Command="$(Tf) workspace /new $(DatabaseSourceWorkspaceName) /server:$(TeamFoundationServerUrl) /noprompt" />
    <Exec Command="$(Tf) workfold /unmap /workspace:$(DatabaseSourceWorkspaceName) $/" />
    <Exec Command="$(Tf) workfold /map /workspace:$(DatabaseSourceWorkspaceName) /server:$(TeamFoundationServerUrl) $(DatabaseSourceLocation) &quot;$(DatabaseBuildBaseLocation)&quot;"  />
</Target>

TFS是您的源存储库,但您没有明确提到构建脚本的设计目标。你真的应该将它们迁移到TFS构建脚本,然后你可以简化你的构建,例如你不必担心映射工作区或获取最新的源代码,因为TFS为你做了,你只需要担心的是任何自定义构建步骤,并可能存档构建结果。

答案 2 :(得分:3)

Neno Loje创建了a small utility that does exactly what you need。如果需要,要启动它还可以从解决方案和项目文件中删除任何源代码控制绑定。

答案 3 :(得分:1)

C#具有VersionControlServer库,您可以使用VersionControlServer.GetItems调用来获取TFS Item。如果ItemType是File,则调用DownloadFile以检索文件。

答案 4 :(得分:0)

我不知道为什么你的构建文件每次都会删除工作区目录。但是为了回答你的问题,我不认为你可以在没有工作空间的情况下从TFS获得源代码。也许你可以尝试在每次获得之前创建一个恶意空间。命令是

tf.exe workspace /new