Как создать безопасную ветвь визуального источника с помощью NANT
-
29-09-2019 - |
Вопрос
Резюме
У меня сейчас есть NAnt
построить сценарий, который выполняет vssget
На последнем исходном коде или в конкретной ветви (используя ${branch}
параметр).
Всякий раз, когда мы делаем производственную сборку/развертывание, созданное кодовое дерево, создано филиал, (чтобы мы могли продолжить разработку и до сих пор знать, какая кодовая база находится на производстве, довольно стандартные вещи ...)
Проблема
Процесс создания этой ветви по -прежнему является ручным, выполняемым кем -то, кто входит в визуальный источник Safe Explorer и выполняющий процедуру ветвления. Мне было интересно, есть ли какой -нибудь способ в NAnt
создания ветви VSS.
Текущий план
Я уже знаю об использовании <exec program="ss">
И я пытаюсь избежать этого, но в отсутствие каких -либо лучших решений, это самый вероятный путь, который я буду идти.
Кто -нибудь знает, есть ли NAnt
или NAntContrib
Цель для этого, или если у кого -то есть задача сценария, которую он использовал для этого в прошлом и мог бы предоставить код для этого, это было бы очень оценено.
Отказ от ответственности
Я знаю о CVS, SVN, GIT и всех других решениях по управлению источниками, и изменение инструмента не является вариантом в настоящее время
Решение
Нам действительно нужно это, где я работаю. Я собрал небольшую задачу под названием «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 (сборка 0,85,2478,0; выпуск; 14.10.2006) Copyright (C) 2001-2006 Джерри Шоуhttp://nant.sourceforge.net
BuildFile: File: /// C: /scm/custom/src/vssbranch/bin/debug/test.build Target Framework: Microsoft .net Framework 2.0.
бежать:
LoadTasks] сканирование сборки "nant.contrib.tasks" для расширений. [LoadTasks] Сканирование сборки "VSSBranch" для расширений. [Echo] собирается выполнить: ветвь VSS
....
vssbranch] Перепечивание пути безопасности Протото: $/vss/endur's source/c#/dailylive/proto/test-ranch/securityproto
....
Строительство удалось
Общее время: 12,9 секунды.
Очевидно, что вывод варьировался, я тянул элементы в ветвь из текстового файла с именем 'params.txt'. Эта задача выполняет то, что известно в мире VSS как «Share and Branch» (ветвление сразу после обмена) ... Другие системы управления источниками не должны делиться перед ветвью, а ... это на другой день
Другие советы
Задачи VSS живут в проекте NantContrib, и нет, в настоящее время нет никакой задачи, которая поддерживает ветвление. Несмотря на то, что следуя модели существующих задач VSS (Add, Checkout, Checkin и т. Д.) в NantContrib, вы можете Возьмите источник и расширяйте это самостоятельно. То есть, если VSS API поддерживает ветвление.