2012-04-28 21 views
8

मेरे पास csproj फ़ाइलों का संग्रह है जो सभी स्रोत फ़ाइलों के एक ही सेट को संदर्भित करते हैं, लेकिन इसे थोड़ा अलग डेटा डेटा बनाने के लिए है इसलिए मुझे प्रोजेक्ट फ़ाइलों को अलग रखने की आवश्यकता है। जैसे एक ही प्रोजेक्ट के विनफ़ोन, एक्सबॉक्स, डेस्कटॉप, मोनो टच वेरिएंट हैं।मोनो और मोनो डेवेल के साथ मल्टीटाइक्लिंग सी # प्रोजेक्ट फाइलें

चीजों को वास्तव में डुप्लिकेट किया गया है, जैसे कि संकलन करने के लिए .cs फ़ाइलों की सूची की तरह, मैं सूची को एक फ़ाइल में समेकित करना चाहता हूं, इसलिए मैं यह सुनिश्चित नहीं करता कि सभी भिन्नताओं को सिंक में रखा गया हो । मैंने मूल रूप से .csprojs से स्रोतों को हटाकर और उन्हें एक .targets फ़ाइल में डालकर ऐसा करने की कोशिश की जो सभी csprojs द्वारा आयात किया गया था, लेकिन इससे स्रोत फ़ाइलें VS और MonoDevelop दोनों से गायब हो गईं।

मेरा दूसरा प्रयास डेस्कटॉप csproj फ़ाइल को प्राथमिक बनाकर था, और सभी बदलावों को कुछ सशर्त तर्क के साथ csproj आयात करने देना था। यह स्रोत फ़ाइलों को मुख्य csproj से संपादन योग्य रखता है और वे सभी स्वादों में बनाते हैं। अब विजुअल स्टूडियो समझता है कि मैं क्या करने की कोशिश कर रहा था लेकिन मोनो डेवलप इसे नहीं बना सकता है। Monodevelop समाधान में कोर DLL का iOS संस्करण धूसर हो और कहते हैं "(सक्रिय विन्यास में निर्मित नहीं)"

मैं भी csproj और समाधान है, जो अतीत की समस्याओं monodevelop है कि प्राप्त करने के लिए लगता है xbuilding की कोशिश की है लेकिन monotouch विधानसभाओं को हल करने से संबंधित अन्य चीजों पर हिचकिचाहट। मैंने सोचा था कि मोनो डेवेल ने एक्सबिल्ड का इस्तेमाल किया था, लेकिन शायद नहीं?

चूंकि यह विंडोज एमएसबिल्ड में काम करता है ऐसा लगता है कि यह मोनो में एक बग या समर्थित सुविधा नहीं है। या शायद पूरे परिदृश्य से निपटने का एक बेहतर तरीका है ... सोचा कि मैं यहां पूछूंगा।

स्पष्ट जानकारी के लिए मेरे Core.iOS.csproj फ़ाइल इस तरह दिखता है:

<?xml version="1.0" encoding="utf-8"?> 
<Project 
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 
    DefaultTargets="Build" 
    ToolsVersion="4.0" > 
    <PropertyGroup> 
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> 
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> 
    <ProductVersion>10.0.0</ProductVersion> 
    <SchemaVersion>2.0</SchemaVersion> 
    <ProjectGuid>{AE37B15F-F4BE-48DE-9F20-F00A601EC89E}</ProjectGuid> 
    <ProjectTypeGuids>{6BC8ED88-2882-458C-8E55-DFD12B67127B};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids> 
    <AssemblyName>Core.iOS</AssemblyName> 
    </PropertyGroup> 
    <ItemGroup> 
    <Reference Include="System" /> 
    <Reference Include="System.Core" /> 
    <Reference Include="monotouch" /> 
    </ItemGroup> 
    <Import Project=".\Core.csproj" /> 
    <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> 
</Project> 

और मेरे Core.csproj फ़ाइल इस तरह दिखता है:,

<?xml version="1.0" encoding="utf-8"?> 
<Project 
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 
    DefaultTargets="Build" 
    ToolsVersion="4.0"> 
    <PropertyGroup> 
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> 
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> 
    <OutputType>Library</OutputType> 
    <AppDesignerFolder>Properties</AppDesignerFolder> 
    <RootNamespace>Core</RootNamespace> 
    </PropertyGroup> 
    <!-- Using AssemblyName's presence to check for whether this is imported. --> 
    <PropertyGroup Condition=" '$(AssemblyName)' == '' "> 
    <ProductVersion>8.0.50727</ProductVersion> 
    <SchemaVersion>2.0</SchemaVersion> 
    <ProjectGuid>{FC495BD8-11B1-46B0-A9DE-F245A0CBEE94}</ProjectGuid> 
    <AssemblyName>Core</AssemblyName> 
    <SignManifests>false</SignManifests> 
    </PropertyGroup> 

    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> 
    <DebugSymbols>true</DebugSymbols> 
    <DebugType>full</DebugType> 
    <Optimize>false</Optimize> 
    <OutputPath>bin\Debug\</OutputPath> 
    <DefineConstants>DEBUG;TRACE</DefineConstants> 
    <ErrorReport>prompt</ErrorReport> 
    <WarningLevel>4</WarningLevel> 
    </PropertyGroup> 
    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> 
    <!-- properties similar to Debug --> 
    </PropertyGroup> 
    <ItemGroup Condition=" '$(Platform)' == 'AnyCPU' "> 
    <Reference Include="System" /> 
    <Reference Include="System.Core" /> 
    </ItemGroup> 
    <Import Condition=" '$(AssemblyName)' == 'Core' " Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> 
    <ItemGroup> 
    <Compile Include="[...]" /> 
    <Compile Include="[...]" /> 
    </Project> 

और जैसे मैंने कहा, एक WinPhone और XBox360 प्रोजेक्ट्स के लिए वीएस एक्सप्रेस का उपयोग करते समय इसकी भिन्नता सही ढंग से काम कर रही है। क्या यह कुछ काम करना चाहिए? क्या ऐसा करने के लिए इससे अच्छा तरीका है?

धन्यवाद,

+0

अच्छा लगता है, और मोनोडिफायर आंतरिक रूप से xbuild का उपयोग करता है। आपने किस संस्करण को स्थापित किया है? – skolima

+0

देखने के लिए धन्यवाद। चूंकि मैं खुद को इस सवाल का जवाब देने के लिए शोध कर रहा था, मुझे यह धारणा मिली थी कि मोनो टच परियोजनाओं ने एक्सबिल्ड को छोड़ दिया और सीधे एमसीएस का आह्वान किया, लेकिन मैंने इसे गलत तरीके से पढ़ा होगा या पुराने लेख को देख रहा हूं, लेकिन अगर ऐसा होता तो मैं भी ' टी पता नहीं है कि आईडीई का उपयोग यह तय करने के लिए xbuild का उपयोग करेगा कि कौन से लक्ष्य वैध हैं ... MonoDevelop का मेरा संस्करण 2.8.8.4 है। अगर आपको कुछ भी मदद मिलती है तो कृपया मुझे बताएं यदि आपको रिप्रो की आवश्यकता है। –

उत्तर

9

लघु जवाब:

यह काम नहीं करेगा क्योंकि हालांकि monodevelop MSBuild फ़ाइल स्वरूप का उपयोग करता है, यह अभी तक सभी परियोजना प्रकार के लिए वास्तविक MSBuild/xbuild इंजन का उपयोग नहीं करता है। मैं शामिल करने के बजाय लिंक का उपयोग करने का सुझाव देना चाहूंगा।

पूर्ण पृष्ठभूमि:

monodevelop एक पुराने आंतरिक निर्माण इंजन कि SharpDevelop 1.0 निर्माण इंजन से ली गई है, यानी यह MSBuild के अस्तित्व से पहले है। हम एमएसबिल्ड में माइग्रेट करने की प्रक्रिया में हैं, लेकिन इसने कई चरणों को लिया है, और अभी तक पूरा नहीं हुआ है।

कुछ साल पहले, मोनो डेवेल ने एमएसबिल्ड के विजुअल स्टूडियो संगत सबसेट में अपनी परियोजना फ़ाइल प्रारूप स्विच किया था। यह एमएस के आंतरिक परियोजना मॉडल में ज्ञात एमएसबिल्ड गुणों और वस्तुओं को क्रमबद्ध/deserializing द्वारा किया गया था, लेकिन पुराने निर्माण इंजन का उपयोग कर निर्माण कर रहा था। इसका मतलब यह था कि किसी भी एमएसबिल्ड परियोजनाओं ने केवल विजुअल स्टूडियो यूआई से सुलभ सुविधाओं का उपयोग किया है। हालांकि, यह अधिक उन्नत एमएसबिल्ड सुविधाओं का समर्थन नहीं करता है जो एमएसबिल्ड एक्सएमएल को हाथ से संपादित करके ही पहुंच योग्य हैं।

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

एंड्रॉइड के लिए मोनो विजुअल स्टूडियो में समर्थित होना आवश्यक था, इसलिए एमएसबिल्ड लक्ष्य होना था। दो बिल्ड इंजनों के लिए बिल्ड कोड लिखने और बनाए रखने के बजाय, हमने एक्सबिल्ड और मोनो डेवेल के एमएसबिल्ड इंजन एकीकरण को समाप्त किया ताकि इसका उपयोग एंड्रॉइड प्रोजेक्ट्स के लिए मोनो के लिए किया जा सके। हालांकि, हम एमडी में डिफ़ॉल्ट रूप से एक्सबिल्ड बिल्ड इंजन को सक्षम नहीं कर सके, क्योंकि कई अन्य प्रोजेक्ट प्रकारों में अभी तक xbuild लक्ष्य नहीं हैं। इसके बजाए, हमने प्रोजेक्ट एडिन को प्रति-परियोजना-प्रकार के आधार पर एक्सबिल्ड इंजन के उपयोग को मजबूर करने की अनुमति दी।

यह अनिवार्य रूप से वर्तमान स्थिति है - xbuild इंजन का उपयोग एंड्रॉइड प्रोजेक्ट्स के लिए मोनो के लिए किया जाता है, और नए प्रोजेक्ट प्रकार जैसे आईफोन बाइंडिंग प्रोजेक्ट्स और पीएलपी परियोजनाओं, और नए प्रोजेक्ट प्रकारों के लिए अनुशंसित है। लेकिन पुराने परियोजना प्रकार जैसे मोनो टच, मोनोमैक, एएसपी.नेट इत्यादि अभी तक लिखने के समय माइग्रेट नहीं किए गए हैं।

+0

क्या यह अभी भी नई ज़ैमरिन 2 रिलीज के साथ सच है? –

+0

हां। यह भी देखें http://mjhutchinson.com/journal/2012/08/19/state_msbuild_support_monodevelop –

+0

क्या इस समय कोई भी अपडेट है? – Sjoerd222888