سؤال

ملخص
لدي حاليا NAnt بناء البرنامج النصي الذي يؤدي vssget على أحدث رمز مصدر ، أو فرع معين (باستخدام أ ${branch} معامل).

كلما قمنا ببناء/نشر إنتاج ، فإن شجرة الكود التي تم إنشاؤها لها فرع تم إنشاؤه ، (حتى نتمكن من مواصلة التطوير وما زلنا نعرف ما هي قاعدة كود في الإنتاج ، والأشياء القياسية الجميلة ...)

مشكلة
لا تزال عملية إنشاء هذا الفرع دليلًا يدويًا ، ويتم القيام به من قبل شخص ما يدخل إلى مستكشف Safe Source المرئي ويقوم بإجراء الإجراء المتفرعة. كنت أتساءل عما إذا كان هناك أي طريقة 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 (Build 0.85.2478.0 ؛ الإصدار ؛ 10/14/2006) حقوق الطبع والنشر (C) 2001-2006 Gerry Shawhttp://nant.sourceforge.net

buildfile: ملف: /// c: /scm/custom/src/vssbranch/bin/debug/test.build الإطار الهدف: Microsoft .NET Framework 2.0 الهدف (S) المحدد: Run

يجري:

loadtasks] تجميع المسح "nant.contrib.tasks" للتمديدات. [loadtasks] تجميع المسح "vssbranch" للملحقات. [صدى] على وشك التنفيذ: فرع VSS

....

vssbranch] مسار الأمان المتفرعة: $/vss/endur's source/c#/dailylive/proto/test-branch/securityproto

....

نجح بناء

إجمالي الوقت: 12.9 ثانية.

من الواضح أن الإخراج سيختلف ، كنت أسحب العناصر إلى الفرع من ملف نصي يسمى "params.txt". تنفذ هذه المهمة ما هو معروف في عالم VSS باسم "المشاركة والفرع" (المتفرعة فور المشاركة) ... لا تحتاج أنظمة التحكم في المصادر الأخرى إلى المشاركة قبل التفرع ، إيه ... هذا ليوم آخر

نصائح أخرى

تعيش مهام VSS في مشروع NantContrib و NO ، لا توجد مهمة تدعم المتفرعة حاليًا. على الرغم من ذلك ، باتباع نموذج مهام VSS الحالية (إضافة ، الخروج ، فحص ، إلخ) في NantContrib ، يمكنك الاستيلاء على المصدر وتوسيعها بنفسك. هذا هو، إذا API VSS يدعم المتفرعة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top