سؤال

لدينا أداة تنشئ بعض ملفات التعليمات البرمجية (.CS) التي يتم استخدامها لإنشاء المشروع.

تحرير: هذه الملفات هي النصف الآخر من بعض الفئات الجزئية ، وبالتالي فإن عملية الإنشاء تتطلب الوصول إلى المصدر. لا يمكن تجميعه في DLL ، على سبيل المثال ، ثم تعيين ترتيب الإنشاء.

يتم تشغيل الأداة أثناء خطوة ما قبل البناء ، ولكن يتم تحديث الملفات في الحل فقط بعد الإنشاء ، مما يعني أنه يجب تنفيذ البناء مرتين لمسح الأخطاء بعد التغيير في الإدخال.

مثال:

  • تعديل ملف إدخال الأداة
  • تشغيل بناء
    • تعمل الأداة وتغيير الملف المصدر
  • فشل البناء
  • تشغيل بناء
    • تعمل الأداة وتغيير الملف المصدر (لكنه لا يتغير فعليًا ، لأن الإدخال يبقى كما هو)
  • البناء ينجح

أي أفكار كيف يمكننا التخلص من البناء المزدوج ، وما زلنا ندع أداةنا تعمل من VS؟

شكرا يا رفاق!

هل كانت مفيدة؟

المحلول 3

اتضح أن الجواب "يستخدم كيك"و PowerShell

نصائح أخرى

سيكون من التافهة كتابة ماكرو VS من شأنه تنفيذ أداتك ثم بدء بناء حتى تتمكن من تنفيذ العملية بأكملها باستخدام مفاتيح واحدة ، بطريقة أسرع في القيام ببناء مزدوج.

بدلاً من ذلك (أو بالتزامن مع ما سبق) ، يمكنك إضافة أداة مخصصة إلى قائمة VS Tool التي تنفذ الأداة الخاصة بك (انظر الأدوات> الأدوات الخارجية). ثم قم بتنفيذ هذه الأداة المخصصة يدويًا قبل تنفيذ البناء - لا تزال هذه خطوة مزدوجة مملة ، ولكنها أسرع وأسهل بكثير من البناء مرتين. (ومن المحتمل أن تكون قادرًا على ترك أدتك تعمل في خطوة ما قبل البناء ، وبالتالي فإن نهج البناء المزدوج القديم سيظل يعمل).

قد يكون هناك خيار آخر هو تحرير البرنامج النصي MSBuild لمشروعك إلى تنفيذ أداةك في وقت مبكر من عملية الإنشاء بحيث يتم التقاط التغيير إلى الملف أثناء عمليات مسح التبعية (لذلك هناك حاجة إلى تمريرة بناء واحدة فقط).

لا شيء من هذه الحلول رائعة ، ولكن نأمل أن يعطيك تقدمًا يوفر تحسنا مقبولًا على وضعك الحالي.

refactor soln الخاص بك إلى مشروعين: أول ملف CS الخاص بالجنرال ، يستخدمه الثاني (كـ DLL).

يحتوي المشروع الأول (Call It Gen) على أحداث ما بعد البناء: 1 لتشغيل الأداة وإعادة إنشاء الملف المصدر ، و 2) تجميع ملف SRC Gen'ed للاستخدام من قبل المشروع الثاني:

Gen.exe 
csc.exe /target:library Gened.cs

يشير المشروع الثاني (Call It Use) إلى DLL ويطلق عليه.

== Gen.CS

using System.IO;
namespace sm3
{class Gen
{static string bod = "public static int var = 46;";
 static string clas = "public class Gened {" + bod + "}";
 static string ns  = "namespace sm3 {" + clas + "}";
 static void Main(string[] args)
 {StreamWriter SW;
     SW = File.CreateText("Gened.cs");
     SW.WriteLine(ns);
     SW.Close();
    }}}

== use.cs

using System;
namespace sm3
{class Use
    {static void Main(string[] args)
        {Gened g = new Gened();
         Console.Write(Gened.var.ToString());
         Console.ReadLine();
         }}}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top