2012-04-28 30 views
8

Tôi có một bộ sưu tập các tệp csproj mà tất cả đều tham chiếu đến cùng một tập hợp các tệp nguồn, nhưng có dữ liệu đích hơi khác nhau để tôi cần giữ riêng các tệp dự án. Ví dụ. có các phiên bản WinPhone, XBox, Desktop, MonoTouch của cùng một dự án.Tệp dự án Mulitargeting C# với Mono và MonoDevelop

Đối với những thứ thực sự bị trùng lặp, như danh sách tệp .cs cần biên dịch, tôi muốn hợp nhất danh sách thành một tệp để tôi không phải đảm bảo rằng tất cả các biến thể đều được đồng bộ hóa . Ban đầu tôi đã thử làm điều này bằng cách xóa các nguồn khỏi tệp .csprojs và đặt chúng vào tệp .targets được nhập bởi tất cả các csproj, nhưng điều đó làm cho các tệp nguồn biến mất khỏi cả VS và MonoDevelop.

Lần thử thứ hai của tôi là tạo tệp csproj trên Desktop thành tệp chính và cho phép tất cả các biến thể nhập csproj đó bằng một số logic có điều kiện. Điều này giúp các tệp nguồn có thể chỉnh sửa từ csproj chính và chúng được xây dựng thành tất cả các hương vị. Bây giờ Visual Studio hiểu những gì tôi đã cố gắng để làm nhưng MonoDevelop không thể xây dựng nó. Trong giải pháp MonoDevelop phiên bản iOS của DLL lõi được tô xám và nói "(không được xây dựng trong cấu hình hoạt động)"

Tôi cũng đã thử xbuilding csproj và giải pháp, dường như vượt qua các vấn đề mà MonoDevelop có nhưng trục trặc trên những thứ khác liên quan đến việc giải quyết hội đồng monotouch. Tôi đã nghĩ MonoDevelop sử dụng xbuild, nhưng có lẽ không?

Vì tính năng này hoạt động trong Windows msbuild, có vẻ như đó là lỗi hoặc tính năng không được hỗ trợ trong Mono. Hoặc có thể có cách tốt hơn để giải quyết toàn bộ kịch bản ... Tôi nghĩ tôi nên hỏi ở đây.

Đối với chi tiết cụ thể, tập tin Core.iOS.csproj của tôi trông như thế này:

<?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> 

Và tập tin Core.csproj của tôi trông như thế này:

<?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> 

Và, giống như tôi đã nói, một biến thể của điều này có vẻ là làm việc một cách chính xác khi sử dụng VS Express cho các dự án WinPhone và XBox360. Đây có phải là cái gì đó nên làm việc? Có cách nào tốt hơn để làm điều này?

Cảm ơn,

+0

Có vẻ tốt và Monodevelop sử dụng xbuild nội bộ. Phiên bản nào bạn đã cài đặt? – skolima

+0

Cảm ơn bạn đã tìm kiếm. Khi tôi đang nghiên cứu câu trả lời cho câu hỏi này, tôi đã có ấn tượng rằng các dự án MonoTouch đã bỏ qua xbuild và gọi trực tiếp các mcs, nhưng tôi có thể đã đọc sai hoặc đang xem một bài báo cũ, nhưng ngay cả khi đó là trường hợp tôi don ' t biết bao nhiêu IDE sẽ sử dụng xbuild để quyết định mục tiêu nào là hợp lệ ... Phiên bản MonoDevelop của tôi là 2.8.8.4. Xin vui lòng cho tôi biết nếu có bất cứ điều gì tôi có thể giúp nếu bạn cần một repro. –

Trả lời

9

Câu trả lời ngắn:

này sẽ không làm việc vì mặc dù MonoDevelop sử dụng định dạng tập tin MSBuild, nó không sử dụng động cơ/xbuild MSBuild thực sự cho tất cả các loại dự án được nêu ra. Tôi muốn đề xuất sử dụng các liên kết thay vì một liên kết.

Full nền:

MonoDevelop có một động cơ cũ nội build đó là bắt nguồn từ việc xây dựng cơ SharpDevelop 1.0, tức là nó xảy ra trước sự tồn tại của MSBuild. Chúng tôi đang trong quá trình di chuyển sang MSBuild, nhưng điều này đã mất nhiều giai đoạn và chưa hoàn thành.

Một vài năm trước, MonoDevelop đã chuyển dự án của mình định dạng tệp thành tập hợp con Visual Studio tương thích của MSBuild. Điều này đã được thực hiện bằng cách tuần tự hóa/deserializing MSBuild được biết đến tài sản và các mặt hàng vào mô hình dự án nội bộ của MD, nhưng làm việc xây dựng bằng cách sử dụng động cơ xây dựng cũ. Điều này có nghĩa rằng bất kỳ dự án MSBuild nào chỉ sử dụng các tính năng có thể truy cập được từ Visual Studio UI đều hoạt động tốt. Tuy nhiên, nó không hỗ trợ các tính năng MSBuild nâng cao hơn mà chỉ có thể truy cập bằng cách chỉnh sửa bằng tay MSBuild XML.

Sau đó MD đã được hỗ trợ thử nghiệm để sử dụng công cụ xây dựng xbuild/MSBuild, nhưng tại thời điểm xbuild không trưởng thành và không có mục tiêu MSBuild cho tất cả các loại dự án. Nó vẫn còn thử nghiệm, và xây dựng mã cho các loại dự án mới (MonoTouch, vv) được viết bằng cách sử dụng công cụ xây dựng nội bộ MD.

Mono cho Android cần được hỗ trợ trong Visual Studio, vì vậy phải có mục tiêu MSBuild. Thay vì viết và duy trì mã xây dựng cho hai công cụ xây dựng, chúng tôi đã hoàn thành xbuild và tích hợp công cụ MSBuild của MonoDevelop để nó có thể được sử dụng cho Mono cho các dự án Android. Tuy nhiên, chúng tôi không thể kích hoạt công cụ xây dựng xbuild theo mặc định trong MD, vì nhiều loại dự án khác chưa có mục tiêu xbuild. Thay vào đó, chúng tôi đã cho phép các dự án bổ sung buộc sử dụng công cụ xbuild trên cơ sở kiểu dự án.

Đây thực chất là trạng thái hiện tại - công cụ xbuild được sử dụng cho Mono cho dự án Android và các loại dự án mới hơn như dự án Binding iPhone và dự án PLP và được đề xuất cho các loại dự án mới. Nhưng các loại dự án cũ hơn như MonoTouch, MonoMac, ASP.NET vv vẫn chưa được di chuyển tại thời điểm viết.

+0

Điều này có đúng với bản phát hành Xamarin 2 mới không? –

+0

Có. Xem thêm http://mjhutchinson.com/journal/2012/08/19/state_msbuild_support_monodevelop –

+0

Có bất kỳ cập nhật nào về điều này trong thời gian trung bình không? – Sjoerd222888

Các vấn đề liên quan