必须构建2个解决方案,每个项目一个

时间:2015-07-10 13:16:37

标签: visual-studio-2012 tfs tfsbuild tfs2013

我们必须在TFS服务器上构建两个解决方案。一个解决方案是一个框架,另一个包括服务,应该按照项目单独构建,以便稍后通过脚本部署它们。

此外,框架程序集将复制到框架解决方案中的(基础)项目中。第二个解决方案的所有项目都参考了这个“基础”项目。

我的问题是,我不知道如何配置解决方案,项目和构建,以表现上述请求。

请帮忙。

注意:我不想将每个服务项目放入msi以便安装它。我只是想从TFS服务器上的中央drop-folder部署服务。

2 个答案:

答案 0 :(得分:2)

  1. Team Build可以在构建过程模板中构建多个解决方案。只需点击要构建的项目后面的[...]按钮,然后添加两个解决方案。

  2. TFS重定向项目的输出目录,这可能会破坏将A的输出复制到"基础项目​​的脚本。 B.为了转换此重定向,将输出位置设置为AsConfigured。

  3. 现在,TFS不知道如何将输出复制到Binaries文件夹,该文件夹用作复制到droplocation操作的源。要解决这个问题,您需要编写一个powershell脚本和configure this as a post-build script

  4. enter image description here

    创建放置脚本的过程为clearly documented on MSDNsample script is available from CodePlex

    ##-----------------------------------------------------------------------
    ## <copyright file="GatherItemsForDrop.ps1">(c) http://TfsBuildExtensions.codeplex.com/. This source is subject to the Microsoft Permissive License. See http://www.microsoft.com/resources/sharedsource/licensingbasics/sharedsourcelicenses.mspx. All other rights reserved.</copyright>
    ##-----------------------------------------------------------------------
    # Copy the binaries to the bin directory 
    # so that the build server can drop them
    # to the staging location specified on the Build Defaults tab 
    #
    # See 
    #   http://msdn.microsoft.com/en-us/library/bb778394(v=vs.120).aspx
    #   http://msdn.microsoft.com/en-us/library/dd647547(v=vs.120).aspx#scripts     
    
    # Enable -Verbose option
    [CmdletBinding()]
    
    # Disable parameter
    # Convenience option so you can debug this script or disable it in 
    # your build definition without having to remove it from
    # the 'Post-build script path' build process parameter.
    param([switch]$Disable)
    if ($PSBoundParameters.ContainsKey('Disable'))
    {
        Write-Verbose "Script disabled; no actions will be taken on the files."
    }
    
    # This script copies the basic file types for managed code projects.
    # You can change this list to meet your needs.
    $FileTypes = $("*.exe","*.dll","*.exe.config","*.pdb")
    
    # Specify the sub-folders to include
    $SourceSubFolders = $("*bin*","*obj*")
    
    # If this script is not running on a build server, remind user to 
    # set environment variables so that this script can be debugged
    if(-not $Env:TF_BUILD -and -not ($Env:TF_BUILD_SOURCESDIRECTORY -and $Env:TF_BUILD_BINARIESDIRECTORY))
    {
        Write-Error "You must set the following environment variables"
        Write-Error "to test this script interactively."
        Write-Host '$Env:TF_BUILD_SOURCESDIRECTORY - For example, enter something like:'
        Write-Host '$Env:TF_BUILD_SOURCESDIRECTORY = "C:\code\FabrikamTFVC\HelloWorld"'
        Write-Host '$Env:TF_BUILD_BINARIESDIRECTORY - For example, enter something like:'
        Write-Host '$Env:TF_BUILD_BINARIESDIRECTORY = "C:\code\bin"'
        exit 1
    }
    
    # Make sure path to source code directory is available
    if (-not $Env:TF_BUILD_SOURCESDIRECTORY)
    {
        Write-Error ("TF_BUILD_SOURCESDIRECTORY environment variable is missing.")
        exit 1
    }
    elseif (-not (Test-Path $Env:TF_BUILD_SOURCESDIRECTORY))
    {
        Write-Error "TF_BUILD_SOURCESDIRECTORY does not exist: $Env:TF_BUILD_SOURCESDIRECTORY"
        exit 1
    }
    Write-Verbose "TF_BUILD_SOURCESDIRECTORY: $Env:TF_BUILD_SOURCESDIRECTORY"
    
    # Make sure path to binary output directory is available
    if (-not $Env:TF_BUILD_BINARIESDIRECTORY)
    {
        Write-Error ("TF_BUILD_BINARIESDIRECTORY environment variable is missing.")
        exit 1
    }
    if ([IO.File]::Exists($Env:TF_BUILD_BINARIESDIRECTORY))
    {
        Write-Error "Cannot create output directory."
        Write-Error "File with name $Env:TF_BUILD_BINARIESDIRECTORY already exists."
        exit 1
    }
    Write-Verbose "TF_BUILD_BINARIESDIRECTORY: $Env:TF_BUILD_BINARIESDIRECTORY"
    
    # Tell user what script is about to do
    Write-Verbose "Will look for and then gather "
    Write-Verbose "$FileTypes files from"
    Write-Verbose "$Env:TF_BUILD_SOURCESDIRECTORY and copy them to "
    Write-Verbose $Env:TF_BUILD_BINARIESDIRECTORY
    
    # Find the files
    $files = gci $Env:TF_BUILD_SOURCESDIRECTORY -recurse -include $SourceSubFolders | 
        ?{ $_.PSIsContainer } | 
        foreach { gci -Path $_.FullName -Recurse -include $FileTypes }
    if($files)
    {
        Write-Verbose "Found $($files.count) files:"
    
        foreach ($file in $files) {
            Write-Verbose $file.FullName 
        }
    }
    else
    {
        Write-Warning "Found no files."
    }
    
    # If binary output directory exists, make sure it is empty
    # If it does not exist, create one
    # (this happens when 'Clean workspace' build process parameter is set to True)
    if ([IO.Directory]::Exists($Env:TF_BUILD_BINARIESDIRECTORY)) 
    { 
        $DeletePath = $Env:TF_BUILD_BINARIESDIRECTORY + "\*"
        Write-Verbose "$Env:TF_BUILD_BINARIESDIRECTORY exists."
        if(-not $Disable)
        {
            Write-Verbose "Ready to delete $DeletePath"
            Remove-Item $DeletePath -recurse
            Write-Verbose "Files deleted."
        }   
    } 
    else
    { 
        Write-Verbose "$Env:TF_BUILD_BINARIESDIRECTORY does not exist."
    
        if(-not $Disable)
        {
            Write-Verbose "Ready to create it."
            [IO.Directory]::CreateDirectory($Env:TF_BUILD_BINARIESDIRECTORY) | Out-Null
            Write-Verbose "Directory created."
        }
    } 
    
    # Copy the binaries 
    Write-Verbose "Ready to copy files."
    if(-not $Disable)
    {
        foreach ($file in $files) 
        {
            Copy $file $Env:TF_BUILD_BINARIESDIRECTORY
        }
        Write-Verbose "Files copied."
    }
    

    更好的解决方案可能是拥有2个独立的构建,其中第一个构建将第二个项目的依赖项作为NuGet包发布。 The Microsoft ALM Rangers have delivered a guide解释了如何设置它。

答案 1 :(得分:1)

一种选择是托管您自己的nuget Feed:http://docs.nuget.org/create/hosting-your-own-nuget-feeds

通过托管您自己的Feed,您可以在构建过程中执行自定义构建活动,以更新您的Feed。

有关自定义tfs构建活动的信息,请参阅此文档:http://nakedalm.com/creating-a-custom-activity-for-team-foundation-build/

请参阅此文档,了解如何在构建过程中添加PowerShell:http://blogs.technet.com/b/heyscriptingguy/archive/2014/04/21/powershell-and-tfs-the-basics-and-beyond.aspx

通过托管您自己的nuget Feed,您可以让您的消费解决方案利用您的私有块Feed和包来处理依赖关系管理和版本。通过利用自定义构建活动,您可以通过.net或powershell更新nuget源。您还可以通过PowerShell脚本自动执行部署。