分布式 VM 上的 TFS 工作区

TFS Workspace on distributed VM

我们有一个 "SDK" VM,我们分发给所有开发人员。这不是理想的解决方案,但不幸的是,这是针对我们所处情况的最佳解决方案。我们大约每月分发一次,所以我正在努力做到这一点,因此一旦开发人员获得它,"setup" 就尽可能少。

由于多种原因,我们无法更改主机名。

我想知道是否有一种方法可以让每个人都可以使用主机名/工作区/文件夹位置,而不会出现 "Path in use" 和其他类型错误。

我之前将其设置为共享工作区,但这会导致开发人员不使用 "Get Specific Version" 并且更改会丢失。

我也尝试过对 SymLink 文件夹做一些事情,但没有成功。

有人 运行 以前参与过此设置吗?你是如何让这个工作成功的?

如果您想使用一台计算机供团队协作,请在 高级 工作区选项中选择 Public 工作区努力。

但是如果你想在 Visual Studio 的多个实例中使用相同的工作区,则不支持这种用法,尽管 Visual Studio 不会阻止你 运行 多个实例针对相同的工作区。此外,如果您使用的是本地工作区,以这种方式工作更有可能导致问题。

这就是我能够 "Resolve" 这个问题的方式。可能有点老套,但可能对某人有帮助。

我创建了一个批处理文件来自动设置工作区。由于每个人的计算机名称都相同,因此我需要为每个用户提供不同的路径。我还需要特定文件夹中的实际源代码,所以这是我所做的非常简单的事情。

Configure TFS for VM

  1. 提示用户输入用户名
  2. 创建C:\TFS\%用户名%
  3. 删除所有缓存的工作区
  4. 创建一个新的命名工作区 (%username%-sdk)
  5. 将所需的 TFS 路径映射到所需的文件夹
  6. 删除基础 $\ 映射
  7. 获取映射路径的源代码
  8. 创建从他们的 TFS 文件夹到 C:\SDK(需要的文件夹)的符号链接
  9. 从符号链接控制器启动应用程序以维护正确的映射。

如果以后有人需要的话,这里是实际的代码。

@echo off
SET me=%~n0
SET parent=%~dp0
SET log=%TEMP%\%me%.txt
SET %ERRORLEVEL%=0

echo ============================================
echo    %me%
echo ============================================

:AdminCheck
net session >nul 2>&1
IF %ERRORLEVEL% EQU 0 ( 
    ECHO. 
) ELSE (
    ECHO Must run as an Administrator. Exiting...
    ECHO.
    EXIT /B 1
)

:DeleteWarning
echo.
echo  WARNING! This will delete all code in C:\TFS so make sure 
echo  all of your code is committed or your code will be lost!!!
echo.
set /p accept=To continue deleting type 'y': 

if not "%accept%" == "y" exit

:StartProcess
cls
echo ============================================
echo    %me%
echo ============================================
echo.

:: get user name used to create name directory and workspace name
set /p userDir=Network Username:  

:: set script variables
set sourceBase=C:\TFS
set sourcePath=%sourceBase%\%userDir%
set sourceWidgetPath=%sourcePath%\Widgets
set sourceProviderPath=%sourcePath%\Providers

:: set TFS related variables
set tfsCollection=[TFSSERVER]
set workspaceName=%userDir%-SDK
set tfsWidgetPath=[$/TFSPATH]
set tfsProviderPath=[$/TFSPATH]

:: set symlinked destination paths
set sdkWidgetPath=C:\SDK\Widgets
set sdkProviderPath=C:\SDK\Providers

:: launch VsDevCmd so we can execute tfs commands
call "C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\VsDevCmd.bat"

:DeleteDirectories
echo.
echo ## Delete TFS Directory ##
del /q /s /f "%sourceBase%\*" 1>nul
for /d %%x in ("%sourceBase%\*") do @rd /s /q "%%x"

:CreateDirectory
echo.
echo ## Create TFS Directory ##
mkdir %sourcePath%
cd %sourcePath%

:SetupWorkspace
echo.
echo ## Creating TFS Workspace %workspaceName% ##

:: create workspace
tf workspaces /remove:*
tf workspace /new %workspaceName% /collection:%tfsCollection% /noprompt

:: map specific folders
tf workfold /map %tfsWidgetPath% %sourceWidgetPath% /collection:%tfsCollection% /workspace:%workspaceName%
tf workfold /map %tfsProviderPath% %sourceProviderPath% /collection:%tfsCollection% /workspace:%workspaceName%

::remove base path mapping
tf workfold /unmap $/ /collection:%tfsCollection% /workspace:%workspaceName%

:GetSourceCode
echo.
echo ## Get Latest Source Code ##
tf get %tfsWidgetPath% /recursive
tf get %tfsProviderPath% /recursive

:CreateSymLink
cls
echo.
echo ## Setup Widget and Provider SymLinks ##

:: remove target folders if exist
IF EXIST %sdkWidgetPath% RD /q /s %sdkWidgetPath%
IF EXIST %sdkProviderPath% RD /q /s %sdkProviderPath%

:: create symlinks
mklink /D %sdkWidgetPath% %sourceWidgetPath%
mklink /D %sdkProviderPath% %sourceProviderPath%

cls
echo ============================================
echo    %me% [Completed]
echo ============================================
echo.
echo Workspace Created: %workspaceName%
echo.
echo Widget Source: %sourceWidgetPath%
echo Widget Working Directory: %sdkWidgetPath%
echo.
echo Provider Source: %sourceProviderPath%
echo Provider Working Directory: %sdkProviderPath%
echo.

PAUSE