0

まとめ
現在、最新のソース コードまたは特定のブランチ (パラメーターを使用)NAntに対して実行するビルド スクリプトがあります。vssget${branch}

本番ビルド/デプロイを行うときはいつでも、ビルドされたコードツリーにブランチが作成されます(開発を続行し、本番環境のコードベースが何であるかを知ることができるように、かなり標準的なものです...)

問題
その分岐の作成プロセスは依然として手動であり、Visual Source Safe Explorer にアクセスして分岐手順を実行する人によって実行されます。NAntVSS ブランチを作成する方法があるかどうか疑問に思っていました。

現在の計画
私は使用についてすでに知っており <exec program="ss">、それを回避しようとしていますが、より良い解決策がない場合、それが私がとる可能性が最も高いルートです.

NAntこのためのまたはターゲットがあるかどうか、または過去にこれを実行するために使用したスクリプトタスクがあり、そのコードを提供できる人がいるかどうかを知っている人はいますか?それNAntContribは非常に高く評価されます.

免責事項
cvs、svn、git、およびその他すべてのソース管理ソリューションについて知っていますが、現時点ではツールを変更することはできません。

4

2 に答える 2

1

vss タスクは NAntContrib プロジェクトにあり、現在、分岐をサポートするタスクはありません。ただし、NAntContrib の既存の vss タスク (追加、チェックアウト、チェックインなど) のモデルに従って、ソースを取得して自分で拡張することができます。つまり、VSS API が分岐をサポートしている場合です。

于 2010-08-20T10:41:49.400 に答える
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 (ビルド 0.85.2478.0; リリース; 2006 年 10 月 14 日) Copyright (C) 2001-2006 Gerry Shaw http://nant.sourceforge.net

ビルドファイル: 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's Source/C#/DailyLive/proto/test-branch/SecurityProto

....

ビルド成功

合計時間: 12.9 秒。

明らかに出力は異なります。「params.txt」という名前のテキスト ファイルから分岐する項目を取得していました。このタスクは、VSS の世界で「共有と分岐」(共有直後の分岐) として知られていることを実行します...他のソース管理システムは、分岐前に共有する必要はありません。ええと...それはまた別の機会に

于 2010-08-25T00:37:50.203 に答える