How to get Workspace object in new TeamFoundation 2013 Templates

不羁岁月 提交于 2019-12-23 08:25:34

问题


In new version of TeamFoundation 2013 default build templates, the Workspace variable is missing. It is needed as intput parameter for few key activities like ConvertWorkspaceItem. How do I get current workspace for TfvcTemplate.12.xaml templates? I've tried to use this msdn thread but it's not working for me (returns null workspace name). Any suggestions?


回答1:


There's a new activity in 2013 called GetLocalPath that replaces ConvertWorkspaceItem. The activity is under the Microsoft.TeamFoundation.Build.Activities.Core namespace in the Microsoft.TeamFoundation.Build.Activities assembly.

It uses the LocalPathProvider class that aggregates all workspaces used in the build and exposes path translation for all of them in one place. This basically removes the dependency of knowing the workspace in order to translate server paths to local paths and allows you to use as many workspaces as you want without worrying about breaking something down the line.

When MS takes something away, it's usually for a good reason. "hacking" is really not necessary.




回答2:


I went with a hack using internal classes from Microsoft.TeamFoundation.Build.Activities.dll (used by microsoft to create workspace name). You need to create custom activity with following code:

public sealed class GetDefaultWorkspace : BaseActivity<Workspace>
{     
    public override Activity CreateBody()
    {
        var type = typeof(TfGetSources).Assembly.GetType("Microsoft.TeamFoundation.Build.Activities.TeamFoundation.TfGetSources+GetDefaultWorkspaceName");

        var activity = (CodeActivity<string>)Activator.CreateInstance(type);
        var sequence = new Sequence();
        var workspaceName = new Variable<string>();

        sequence.Variables.Add(workspaceName);
        sequence.Activities.Add(activity);
        activity.Result = (OutArgument<string>) workspaceName;

        sequence.Activities.Add(new GetWorkspace
            {
                Name = workspaceName,
                Result = new LambdaReference<Workspace>(ctx => Result.Get(ctx))
            });

        return sequence;
    }
}



回答3:


This answer might work better for some people. ghord's answer works well, and passes the Workspace back where it can be used in the XAML. However, for my purposes I only want the workspace in my custom TFS activities, so I ended up with this alternative...

public sealed class CustomActivity : CodeActivity
{
    protected override void Execute(CodeActivityContext context)
    {
        // get workspace
        var buildDetail = context.GetExtension<IBuildDetail>();
        var buildAgent = context.GetExtension<IBuildAgent>();
        var buildDirectory = buildAgent.GetExpandedBuildDirectory(buildDetail.BuildDefinition);
        var workspacePath = Path.Combine(buildDirectory, "src");
        var wsInfo = Workstation.Current.GetLocalWorkspaceInfo(workspacePath);
        var tfs = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(wsInfo.ServerUri);
        tfs.Connect(ConnectOptions.None);
        var vcs = tfs.GetService<VersionControlServer>();

        // finally can get to the workspace here
        var workspace = vcs.GetWorkspace(workspacePath);
    }
}

Using this method, I don't have to have an activity that just returns the workspace, and then have to pass the workspace into other TFS activities. I just get the workspace from within my own activity while it runs.




回答4:


I believe the method employed here will use the already downloaded workspace. Keep in mind, that this approach will only work within the scope of "Run on agent" sequence after "Initialize Environment" and before ResetEnvironment within the finally statement of Try Compile, Test, Publish. Else, the workflow will have no knowledge of a sources directory.

http://social.msdn.microsoft.com/Forums/vstudio/en-US/420ba073-bdf5-4ab4-88da-c84561d1a1ba/creating-dynamic-working-folder-in-tfs2013-defaulttemplate?forum=tfsbuild



来源:https://stackoverflow.com/questions/21045345/how-to-get-workspace-object-in-new-teamfoundation-2013-templates

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!