我正在尝试将我们的构建脚本从使用SourceSafe更改为TFS,而不使用MsBuild(还)。
一个小问题是工作区目录由脚本重命名和存档,这使得TFS认为它不需要获取任何文件。即使使用 / force 标志,它也只是获取目录而不获取源文件。
我目前正在使用
TF.exe get "Product/Main/Project1" /force /recursive /noprompt
为了节省我在脚本中管理工作区或使用中间目录,是否有人知道可以获取目录和代码而无需工作空间的命令?
答案 0 :(得分:14)
如果没有工作空间,则无法运行tf get
。原因是服务器需要知道服务器路径和本地路径之间的映射。
如果您正在处理大量文件,则不宜:
原因是每次执行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) "$(DatabaseBuildBaseLocation)"" />
</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