我有一组 csproj 文件,它们都引用同一组源文件,但目标数据略有不同,因此我需要将项目文件分开。例如,同一项目有 WinPhone、XBox、Desktop、MonoTouch 变体。
对于真正重复的内容,例如要编译的 .cs 文件列表,我想将列表合并到一个文件中,这样我就不必一直确保所有变体保持同步。我最初尝试通过从 .csprojs 中删除源并将它们放入由所有 csprojs 导入的 .targets 文件来执行此操作,但这会使源文件从 VS 和 MonoDevelop 中消失。
我的第二次尝试是将桌面 csproj 文件作为主要文件,并让所有变体通过一些条件逻辑导入 csproj。这使源文件可以从主 csproj 编辑,并且它们可以构建到所有风格中。现在 Visual Studio 理解了我想要做什么,但 MonoDevelop 无法构建它。在 MonoDevelop 解决方案中,核心 DLL 的 iOS 版本显示为灰色并显示“(未内置在活动配置中)”
我也尝试过构建 csproj 和解决方案,这似乎解决了 MonoDevelop 遇到的问题,但在解决单点触控程序集相关的其他问题上遇到了麻烦。我曾以为 MonoDevelop 使用了 xbuild,但也许不是?
由于这在 Windows msbuild 中有效,因此它似乎是 Mono 中的错误或不支持的功能。或者也许有更好的方法来解决整个场景......我想我会在这里问。
具体来说,我的 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>
而且,就像我说的,在将 VS Express 用于 WinPhone 和 XBox360 项目时,这种变化似乎可以正常工作。这是应该工作的东西吗?有一个更好的方法吗?
谢谢,