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,
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
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. –