2008-11-12 9 views
20

मैं एमएसबिल्ड के लिए एक नया हूं और इसके साथ थोड़ा सा खेलना चाहता था, लेकिन मैं यह नहीं समझ सकता कि यह क्यों काम नहीं कर रहा है।उसी समाधान से कस्टम MSBuild कार्यों का उपयोग करें?

तो मेरे समाधान में दो परियोजनाएं हैं: "मॉडल" और "बिल्डटास्क"।

using Microsoft.Build.Utilities; 

namespace BuildTasks 
{ 
    public class Test : Task 
    { 
     public override bool Execute() 
     { 
      Log.LogMessage("FASDfasdf"); 
      return true; 
     } 
    } 
} 

और फिर Model.csproj में मैं इस जोड़ दिया है:

<UsingTask TaskName="BuildTasks.Test" AssemblyFile="$(SolutionDir)src\BuildTasks\bin\BuildTasks.dll" /> 
    <Target Name="AfterBuild"> 
    <Test /> 
    </Target> 

मैं इतना "BuildTasks" निर्माण के क्रम को सेट कर लेने से पहले "का निर्माण किया जाता है BuildTasks बस एक ही वर्ग है आदर्श"। लेकिन जब मैं मॉडल बनाने की कोशिश मैं इस त्रुटि मिलती है:

The "BuildTasks.Test" task could not be loaded from the assembly C:\WIP\TestSolution\src\BuildTasks\bin\BuildTasks.dll. Could not load file or assembly 'file:///C:\WIP\TestSolution\src\BuildTasks\bin\BuildTasks.dll' or one of its dependencies. The system cannot find the file specified. Confirm that the <UsingTask> declaration is correct, and that the assembly and all its dependencies are available.

इस फ़ाइल में निश्चित रूप से मौजूद है, तो क्यों MSBuild यह नहीं मिल सकता है?

मैंने "$ (SolutionDir)" के स्थान पर "सी: \ WIP \ TestSolution" हार्ड कोडिंग करने का भी प्रयास किया है और एक ही त्रुटि प्राप्त की है। हालांकि, अगर मैं अपने डेस्कटॉप पर .dll कॉपी करता हूं और हार्ड-कोड को अपने डेस्कटॉप पर पथ करता हूं, तो यह करता है काम, जिसे मैं समझ नहीं सकता।

संपादित करें: मेरे पास पथ गलत नहीं है। मैंने बिल्डबस्क के लिए डीबग/रिलीज बिल्ड को संशोधित करने के लिए .dll को बस बिन फ़ोल्डर में आउटपुट करने के लिए संशोधित किया क्योंकि मैं डीबग/रिलीज को अलग-अलग पथ नहीं चाहता था।

+3

क्या आपने समस्या को हल करने का प्रबंधन किया था? मुझे भी वही समस्या हो रही है। – sean

+0

एक संकल्प के बिना 3 साल? मुझे यह समस्या है लेकिन यह पोस्ट थोड़ा सा मदद नहीं करता है क्योंकि यह स्पष्ट नहीं है कि समस्या कभी हल हो गई है ... – DaveN59

उत्तर

1

क्या आप वाकई अपना रास्ता लिखते हैं? क्या यह bin\Configuration Type\BuildTasks.dll में नहीं होना चाहिए?

मुझे यह लिंक मिला: http://bartdesmet.net/blogs/bart/archive/2008/02/15/the-custom-msbuild-task-cookbook.aspx MSBuild कार्यों को लिखना प्रारंभ करते समय बहुत उपयोगी है।

2

Slace यह सही था। असेंबली के लिए आपका रास्ता संभवतः गलत है। और यह शायद होना चाहिए:

<UsingTask 
    TaskName="BuildTasks.Test" 
    AssemblyFile="$(SolutionDir)src\BuildTasks\bin\$(Configuration)\BuildTasks.dll" /> 

<Target Name="AfterBuild"> 
    <Test /> 
</Target> 
+0

@ टिनिस्ट: पथ में $ (कॉन्फ़िगरेशन) का उपयोग करके, ऊपर दिए गए अपने संपादन के अनुसार, सही तरीका है, क्योंकि यह या तो 'रिलीज' या 'डीबग' (या जो भी नाम आप उपयोग करते हैं) – gregmac

0

आप समस्या का निदान करने fuslogvw कोशिश कर सकते हैं, सोचा था कि अगर यह है कि अब तक हो रही है मैं स्पष्ट नहीं कर रहा हूँ ...

http://msdn.microsoft.com/en-us/library/e74a18c4.aspx

10

हम इस कोशिश की और हमने पाया कि आपको प्रोजेक्ट फ़ाइल के शीर्ष पर उपयोग टास्क रखना होगा (और अपने सभी पथ सही हैं)। हालांकि एक बार जब यह जगह हो जाती है और कार्य लोड हो जाता है तो यह केवल एक बार काम करेगा। उसके बाद निर्माण विफल हो रहा है क्योंकि यह उस डीएलएल की प्रतिलिपि नहीं बना सकता है जिसमें कार्य है। हम वास्तव में एक ही बिल्डिंग कार्य चला रहे हैं जो कि उसी असेंबली/प्रोजेक्ट के अंदर है जिसे हम बना रहे हैं।

हमने इसे हल करने के लिए क्या किया है पोस्ट बिल्ड कार्यों को चलाने के लिए एक अलग MSBuild फ़ाइल पर एक अलग MSBuild प्रक्रिया लॉन्च करना है। इस तरह डीएलएल को बिन निर्देशिका में निर्मित और कॉपी करने के बाद तक लोड नहीं किया जाता है।

<Target Name="AfterBuild"> 
    <Exec Command="$(MSBuildBinPath)\MSBuild.exe 
      &quot;$(MSBuildProjectDirectory)\PostBuild.msbuild&quot; 
      /property:SomeProperty=$(SomeProperty)" /> 
</Target> 

ध्यान दें कि आप कमांड लाइन पर इस उप-निर्माण कार्य में गुणों को पारित कर सकते हैं।

और पोस्टबिल्ड।MSBuild इस तरह दिखता है:

<?xml version="1.0" encoding="utf-8"?> 
<Project DefaultTargets="PostBuild" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0"> 
    <UsingTask TaskName="PostBuild" AssemblyFile="$(MSBuildProjectDirectory)\bin\AssemblyThatJustBuiltAndContainsBuildTask.dll" /> 
    <PropertyGroup> 
     <SomeProperty>SomePropertyDefaultValue</SomeProperty> 
    </PropertyGroup> 

    <Target Name="PostBuild"> 
     <MyPostBuildTask SomeProperty="$(SomeProperty)" /> 
    </Target> 
</Project> 
+0

धन्यवाद मेरे लिए बहुत बड़ा समय काम करता है। – daljit

1

अक्षम करना MSBuild नोड पुन: उपयोग भी इस मुद्दे को ठीक कर देंगे:

  • MSBuild कमांड लाइन पर, /nr:false विकल्प गुजरती हैं।
  • विजुअल स्टूडियो के लिए, आपको वीएस शुरू करने से पहले MSBUILDDISABLENODEREUSE पर्यावरण चर 1 पर सेट करना होगा।

Visual Studio 2012 RTM has MSBuild.exe in memory after close

0

अगर सभी कस्टम कार्यों AppDomainIsolatedTask से विरासत कस्टम कार्य DLLs का ताला बचा जा सकता है देखें और यदि आप दृश्य स्टूडियो शुरू करने से पहले वातावरण चर MSBUILDDISABLENODEREUSE = 1 निर्धारित किया है।

कस्टम बिल्ड कार्यों के साथ असेंबली devenv.exe और msbuild.exe द्वारा लॉक है।

आप msbuild.exe प्रक्रिया MSBUILDDISABLENODEREUSE = 1 के साथ दूर जा सकते हैं, लेकिन devenv.exe अभी भी कस्टम कार्य असेंबली को लॉक कर देगा यदि आपके कस्टम कार्य Task से प्राप्त होते हैं।

दूसरी तरफ, यदि आप केवल ऐपडोमेन इसोलेटेड टास्क से प्राप्त होते हैं और MSBUILDDISABLENODEREUSE सेट नहीं करते हैं तो निष्क्रिय एमएसबिल्ड प्रक्रियाएं अभी भी असेंबली को लॉक कर देगी।

+1

क्या आप थोड़ा और समझा सकते हैं? –

+0

मैंने जवाब का विस्तार किया है। – user400144

संबंधित मुद्दे