所以我最近发现,当将
msbuild
与 /p:RestorePackagesPath
标志一起使用时,每个 <HintPath>
文件内的 csproj
标签似乎优先。请参阅此处。
基本上,当执行以下
msbuild
命令时:
MSBuild.exe "C:\ProgramData\SampleProject\SampleProject.sln" /p:RestorePackagesPath="C:\NuGetPackages"
msbuild 不会在指定的
C:\NuGetPackages
文件夹内查找带有 <Reference>
的 <HintPath>
的 NuGet 包。因此,如果在我的 csproj
文件中我有以下条目:
<Reference Include="EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
<HintPath>..\packages\EntityFramework.6.3.0\lib\net45\EntityFramework.dll</HintPath>
</Reference>
msbuild
将在 EntityFramework.6.3.0
文件夹中查找 ..\packages\
NuGet 条目,而不是我在命令行指定的 C:\NuGetPackages
文件夹。
我想我会想出一种方法来指定有条件地忽略
<HintPath>
条目,并且能够在命令行中执行此操作。为此,我执行以下命令:
MSBuild.exe "C:\ProgramData\SampleProject\SampleProject.sln" /p:RestorePackagesPath="C:\NuGetPackages" /p:RemoveHintPathsFlag=true
为了完成这项工作,我在我的
csproj
文件中包含以下内容:
<!-- Define the RemoveHintPaths target that will be executed conditionally -->
<PropertyGroup>
<RemoveHintPathsFlag>false</RemoveHintPathsFlag>
</PropertyGroup>
<Target Name="RemoveHintPaths" BeforeTargets="ResolveReferences" Condition="'$(RemoveHintPathsFlag)' == 'true'">
<ItemGroup>
<!-- Set HintPath to an empty value for all references -->
<Reference Include="@(Reference)">
<HintPath></HintPath>
</Reference>
</ItemGroup>
</Target>
<!-- END OF RemoveHintPaths -->
上面,在第一部分中,我告诉
csproj
文件 RemoveHintPathsFlag
的默认值为 false
,然后我包含一个条件 <Target>
,即在 ResolveTargets
之前运行(我也尝试在 之后运行) ResolveTargets
但这也不起作用)并且基于我在 msbuild
命令中提供的值,特别是 /p:RemoveHintPathsFlag = true
。然而这不起作用,<HintPath>
值仍然全部应用。谁能看出为什么吗?
此外,由于我无法使上述工作正常工作,我想我应该尝试使用暴力方法向
<HintPath>
添加条件,如下所示:
<Reference Include="EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
<HintPath Condition="'$(RemoveHintPathsFlag)'=='false'">..\packages\EntityFramework.6.3.0\lib\net45\EntityFramework.dll</HintPath>
</Reference>
并用
msbuild
呼叫 /p:RemoveHintPathsFlag=true
。令我惊讶的是,这也不起作用。
在项目文件中引用基于条件的一种方法是将它们放在
Choose
中。示例
<Choose>
<When Condition="'$(Configuration)|$(Platform)'=='Release|x86'">
<ItemGroup>
<Reference Include="SomeAssembly">
<HintPath>..\..\bin-x86\SomeAssembly.dll</HintPath>
<Private>true</Private>
</Reference>
</ItemGroup>
</When>
<Otherwise>
<ItemGroup>
<Reference Include="SomeAssembly">
<HintPath>..\..\bin-x64\SomeAssembly.dll</HintPath>
<Private>true</Private>
</Reference>
</ItemGroup>
</Otherwise>
</Choose>