سؤال

أحاول تقديم هدف قابل لإعادة الاستخدام في ملف MSBUILD الخاص بي حتى أتمكن من الاتصال به عدة مرات مع معلمات مختلفة.

لدي هيكل عظمي مثل هذا:

<Target Name="Deploy">
    <!-- Deploy to a different location depending on parameters -->
</Target>

<Target Name="DoDeployments">
    <CallTarget Targets="Deploy">
        <!-- Somehow indicate I want to deploy to dev -->
    </CallTarget>

    <CallTarget Targets="Deploy">
        <!-- Somehow indicate I want to deploy to testing -->
    </CallTarget>
</Target>

لكنني لا أستطيع أن أعمل كيفية السماح بمرور المعلمات في CallTarget, ، ثم بدوره Target بحد ذاتها.

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

المحلول

أهداف MSBUILD ليست مصممة لتلقي المعلمات. بدلا من ذلك، يستخدمون الخصائص التي تحددها لهم.

<PropertyGroup>
    <Environment>myValue</Environment>
</PropertyGroup>

<Target Name="Deploy">
    <!-- Use the Environment property -->
</Target>

ومع ذلك، فإن السيناريو الشائع هو استدعاء هدف عدة مرات مع معلمات مختلفة (أي نشر عدة مواقع). في هذه الحالة، يمكنني استخدام MSBUILD MSBuild مهمة وإرسال المعلمات كخصائص:

<Target Name="DoDeployments">
    <MSBuild Projects ="$(MSBuildProjectFullPath)"
             Properties="VDir=MyWebsite;Path=C:\MyWebsite;Environment=$(Environment)"
             Targets="Deploy" />

    <MSBuild Projects ="$(MSBuildProjectFullPath)"
             Properties="VDir=MyWebsite2;Path=C:\MyWebsite2;Environment=$(Environment)"
             Targets="Deploy" />
</Target>

$(MSBuildProjectFullPath) هو FullPrath من البرنامج النصي الحالي MSBUILD في حال لا تريد إرسال "نشر" إلى ملف آخر.

أتمنى أن يساعدك هذا!

نصائح أخرى

يمكنك أن 'foreach' على ItemGroup مع هدف، عليك فقط القيام بذلك بطريقة تعريفية. يمكنك حتى الحصول على بيانات تعريف إضافية في العناصر، مثل في مثال التعليمات البرمجية:

<ItemGroup>
    <What Include="Dev">
        <How>With bugs</How>
    </What>
    <What Include="Test">
        <How>With tests</How>
    </What>
    <What Include="Chicken">
        <How>Deep fried</How>
    </What>
</ItemGroup>

<Target Name="Deploy">
    <Message Text="@(What), %(How)" />
</Target>

باستخدام مجموعة العناصر كقيمة العددية @(What) داخل الهدف يفعل الحيلة، و %(How) يشير إلى عنصر بيانات التعريف في عنصر Foreach.

إنها طريقة طبيعية لفعل الأشياء في MSBUILD، على سبيل المثال، يمكنك العثور على هذا النمط في كل مكان في ملفات المشروع التي تم إنشاؤها باستخدام Visual Studio.

قد تكون هناك طريقة أفضل للقيام بذلك في MSBUILD، ولكن في النملة، أود استخدام الخصائص العالمية لتحمل معلومات من مهمة إلى أخرى. كان حل رديء، لكنني لم أر طريقة أفضل في ذلك الوقت. يجب أن تكون قادرا على القيام بذلك في MSBUILD، ولكن ضع في اعتبارك أنك ستحتاج إلى استخدام CreateProperty مهمة لتعيين خاصية ديناميكيا.

من ناحية أخرى، من السهل جدا تنفيذ المهام في C # (أو VB أو أيا كان). ربما هذا حلا أفضل بالنسبة لك.

    <CreateProperty
        Value="file1">
        <Output
            TaskParameter="Value"
            PropertyName="filename" />
    </CreateProperty>
    <CallTarget Targets="Deploy"/>
    <Message Text="$(filename)"/>
    <CreateProperty
        Value="file2">
        <Output
            TaskParameter="Value"
            PropertyName="filename" />
    </CreateProperty>
    <Message Text="$(filename)"/>   
    <CallTarget Targets="Deploy"/>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top