2009-07-23 74 views
1

.csprojファイルに<ProjectReference>アイテムグループのすべての要素を削除する条件付きアイテムグループを設定しようとしています。例えばMSBuildエラー:<ProjectReference>要素の属性「Remove」が認識されません。

:奇妙なことがあることである

<ItemGroup> 
    <ProjectReference Include="..\..\..\..\Projects\Registrar\Ucsb.Sa.Registrar.Common\Ucsb.Sa.Registrar.Common\Ucsb.Sa.Registrar.Common.csproj"> 
     <Project>{1EDDDE57-0181-41B4-B2AE-FB76450F85C8}</Project> 
     <Name>Ucsb.Sa.Registrar.Common</Name> 
    </ProjectReference> 
</ItemGroup> 
<ItemGroup Condition="$(OnBuildServer) == 'true'"> 
    <ProjectReference Remove="*" /> 
</ItemGroup> 
<ItemGroup Condition="$(OnBuildServer) == 'true'"> 
    <Reference Include="Ucsb.Sa.Registrar.Common"> 
     <SpecificVersion>False</SpecificVersion> 
     <HintPath>$(RegCommonDll)</HintPath> 
    </Reference> 
</ItemGroup> 

しかし、私はVS 2008にプロジェクトをロードすると、私はエラーメッセージ「属性は「ProjectReference >が認識されない要素<で 『削除』を取得します。 Remove属性はスキーマ(C:¥Program Files¥Microsoft Visual Studio 9.0¥Xml¥Schemas¥1033¥MSBuild¥Microsoft.Build.Core.xsd)にあります。MSDNのドキュメント(http://msdn.microsoft.com/en-us/library/bb651786.aspx)があります。 MSDN記事の末尾にあるコメント" MSBuild Items "

.csprojファイルが.NET 3.5を指しているようです。しかし、私はMSBuildののそのバージョンがプロジェクトをロードするために使用されているかどうかを確認することができません(誰もがそれを行う方法を知っていますか?).csprojファイルの

最初の行:

<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 

PSを。条件を使用するようにしましたBuild with msbuild and dynamically set project references

+0

また、レジストリキーをデフォルトの3.5に変更しようとしました。これらのキーは、Visual Studioを構成するのではなく、新しいプロジェクトを作成するときに既定値を構成します(http://msdn.microsoft.com/en-us/library/bb397428.aspx、\ HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ MSBuild \ 3.5 \、\ HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ MSBuild \ ToolsVersions \ 2.0 \)。 それはもちろん、そのトリックをしていない。 私はPATH環境変数を使い、2.0ディレクトリへのすべての参照を3.5に置き換えました。 この場合も、これは解決策を生成しませんでした。 – smaglio81

答えて

8

を使用することはできません。属性を静的アイテムで削除してください。静的なアイテムはの外にのターゲットと宣言されたものです。この属性は、動的項目宣言のにのみ使用できます。動的項目宣言は、ターゲット内で見つかったものです。たとえば、次のビルドスクリプトを見てみましょう。

<Project ToolsVersion="3.5" 
     xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 

    <ItemGroup> 
    <ProjectReference Include="One.dll"/> 
    </ItemGroup> 
    <Target Name="Demo"> 
    <ItemGroup> 
     <ProjectReference Remove="@(ProjectReference)"/> 
    </ItemGroup> 
    <Message Text="ProjectReference : @(ProjectReference)"/> 
    </Target> 
</Project> 

はまた、あなたがすべてを削除されません削除=「*」を使うべきではないことに注意してください。 ProjectReferenceアイテムグループに含まれている現在のディレクトリ内のすべてのファイルが削除されます。アイテムを削除する場合は、Remove = "@(ProjectReference)" ProjectReferenceはアイテムです。

+0

静的なアイテムを削除する方法はありますか? – citizenmatt

+0

@citizenmattあなたはターゲットのItemGroupを使ってそれを行うことができますが、ターゲット外のItemGroupではRemoveを使うことはできません。 –

+0

それは私が恐れていたものです。ありがとう! – citizenmatt

関連する問題