摘要
我目前有一个NAnt
构建脚本,可以对最新的源代码或特定的分支(使用vssget
参数)执行${branch}
。
每当我们进行生产构建/部署时,构建的代码树都会创建一个分支,(这样我们就可以继续开发并且仍然知道生产什么代码库,非常标准的东西......)< / em>的
问题
创建该分支的过程仍然是手动的,由进入Visual Source Safe Explorer并执行分支过程的人执行。我想知道在创建VSS分支NAnt
中是否有任何方法。
当前计划
我已经知道使用<exec program="ss">
并试图避免这种情况,但在没有任何更好的解决方案的情况下,这是我将采取的最可能的路线。
有没有人知道这个目标是否有NAnt
或NAntContrib
目标,或者是否有人过去曾经使用过这样做的脚本任务,并且可以提供相应的代码,非常感谢。
声明
我了解cvs,svn,git和所有其他源代码管理解决方案,并且目前无法更改该工具
答案 0 :(得分:1)
vss任务存在于NAntContrib项目中,没有,目前没有支持分支的任务。虽然,遵循NAntContrib中现有vss任务(添加,签出,签入等)的模型,您可以grab the source并自己扩展它。也就是说,如果 VSS API支持分支。
答案 1 :(得分:1)
我实际上需要这个我工作的地方。我鞭打了一个名为'vssbranch'的小任务(不是特别有创意,但这里是代码......示例构建文件及其执行的输出:
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using SourceSafeTypeLib;
using NAnt.Core;
using NAnt.Core.Attributes;
namespace NAnt.Contrib.Tasks.SourceSafe
{
[TaskName("vssbranch")]
public sealed class BranchTask : BaseTask
{
/// <summary>
/// The label comment.
/// </summary>
[TaskAttribute("comment")]
public String Comment { get; set; }
/// <summary>
/// Determines whether to perform the branch recursively.
/// The default is <see langword="true"/>
/// </summary>
[TaskAttribute("recursive"),
BooleanValidator()]
public Boolean Recursive { get; set; }
[TaskAttribute("branchname", Required = true)]
public String BranchName { get; set; }
protected override void ExecuteTask()
{
this.Open();
try
{
if (VSSItemType.VSSITEM_PROJECT != (VSSItemType)this.Item.Type)
throw new BuildException("Only vss projects can be branched", this.Location);
IVSSItem newShare = null;
this.Comment = String.IsNullOrEmpty(this.Comment) ? String.Empty : this.Comment;
if (null != this.Item.Parent)
newShare = this.Item.Parent.NewSubproject(this.BranchName, this.Comment);
if (null != newShare)
{
newShare.Share(this.Item as VSSItem, this.Comment,
(this.Recursive) ?
(int)VSSFlags.VSSFLAG_RECURSYES : 0);
foreach (IVSSItem item in newShare.get_Items(false))
this.BranchItem(item, this.Recursive);
}
}
catch (Exception ex)
{
throw new BuildException(String.Format("Failed to branch '{0}' to '{1}'", this.Item.Name, this.BranchName), this.Location, ex);
}
}
private void BranchItem(IVSSItem itemToBranch, Boolean recursive)
{
if (null == itemToBranch) return;
if (this.Verbose)
this.Log(Level.Info, String.Format("Branching {0} path: {1}", itemToBranch.Name, itemToBranch.Spec));
if (VSSItemType.VSSITEM_FILE == (VSSItemType)itemToBranch.Type)
itemToBranch.Branch(this.Comment, 0);
else if (recursive)
{
foreach (IVSSItem item in itemToBranch.get_Items(false))
this.BranchItem(item, recursive);
}
}
}
}
<echo message="About to execute: VSS Branch" />
<echo message="Source Safe Path: ${SourceSafeRootPath}/${CURRENT_FILE}" />
<vssbranch
username="my_user_name"
password="my_password"
recursive="true"
comment="attempt to make a branch"
branchname="test-branch"
dbpath="${SourceSafeDBPath}"
path="${SourceSafeRootPath}/${CURRENT_FILE}"
verbose="true"
/>
</foreach>
</target>
NAnt 0.85(Build 0.85.2478.0; release; 10/14/2006) 版权所有(C)2001-2006 Gerry Shaw http://nant.sourceforge.net
Buildfile:file:/// C:/scm/custom/src/VssBranch/bin/Debug/test.build 目标框架:Microsoft .NET Framework 2.0 指定的目标:运行
运行:
[loadtasks]扫描程序集“NAnt.Contrib.Tasks”以获取扩展名。 [loadtasks]扫描程序集“VssBranch”进行扩展。 [echo]即将执行:VSS分支
...
[vssbranch]分支SecurityProto路径:$ / VSS / Endur的Source / C#/ DailyLive / proto / test-branch / SecurityProto
...
建立成功
总时间:12.9秒。
显然输出会有所不同,我正在从名为'params.txt'的文本文件中提取要分支的项目。此任务执行VSS世界中已知的“共享和分支”(共享后立即分支)...其他源控制系统在分支之前不需要共享,呃......那是另一天