如何有条件地应用“csproj”文件中的“<HintPath>”元素?

问题描述 投票:0回答:1

所以我最近发现,当将

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
。令我惊讶的是,这也不起作用。

c# .net msbuild
1个回答
0
投票

在项目文件中引用基于条件的一种方法是将它们放在

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>
© www.soinside.com 2019 - 2024. All rights reserved.