分布式虚拟机上的TFS工作区

时间:2016-03-15 19:48:53

标签: tfs virtual-machine

我们有一个“SDK”VM,我们分发给所有开发人员。不是理想的解决方案,但不幸的是,这是我们所处情况的最佳解决方案。我们每月分发一次,所以我试图做到这一点,一旦开发人员得到它,尽可能少的“设置”。

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

我需要知道是否有一种方法可以创建一个每个人都可以使用的主机名/工作区/文件夹位置,而不会获得“使用中的路径”和其他类型错误。

我之前将其设置为SHARED工作区,但这导致开发人员不使用“获取特定版本”并且更改会丢失。

我也尝试过使用SymLink文件夹,但是没有成功。

之前有人遇到此设置吗?你是如何成功地完成这项工作的?

2 个答案:

答案 0 :(得分:0)

如果您希望使用单台计算机让团队进行协作,请在高级工作区选项中选择公共工作区

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

答案 1 :(得分:0)

所以这就是我能够“解决”这个问题的方法。也许是hacky但可能对某人有帮助。

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

Configure TFS for VM

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

    @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