构建包时如何限制版本?

How to limit version when building a package?

我有一个多目标项目(netstandard2.0net461)。

当我收集项目时,我得到了一个包。

How can I limit version? (=1.0.6)

我尝试这样做 Version="[1.0.6]",但是项目没有构建

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>netstandard2.0;net461</TargetFrameworks>
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
    <RepositoryUrl></RepositoryUrl>
    <Copyright>-</Copyright>
    <Description>-</Description>
    <Company>-</Company>
    <Authors>-</Authors>
    <PackageProjectUrl>-</PackageProjectUrl>
    <SignAssembly>true</SignAssembly>
    <AssemblyOriginatorKeyFile>OracleExtensions.snk</AssemblyOriginatorKeyFile>
    <DelaySign>false</DelaySign>
    <RestoreProjectStyle>PackageReference</RestoreProjectStyle>
    <Version>1.0.7</Version>
    <AssemblyVersion>1.0.7.0</AssemblyVersion>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <DocumentationFile>bin\Debug\PRB.OracleExtensions.xml</DocumentationFile>
    <DefineConstants>TRACE;DEBUG</DefineConstants>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
    <DocumentationFile>bin\Release\PRB.OracleExtensions.xml</DocumentationFile>
  </PropertyGroup>

  <ItemGroup>
    <None Remove="licenses.licx" />
  </ItemGroup>

  <ItemGroup>
    <EmbeddedResource Include="licenses.licx" />
  </ItemGroup>
  <ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
    <PackageReference Include="Devart.Data" Version="5.0.1926" />
    <PackageReference Include="Devart.Data.Oracle" Version="9.5.502" />
    <PackageReference Include="Devart.Data.Linq" Version="4.8.1471" />
    <PackageReference Include="Devart.Data.Oracle.Linq" Version="4.8.1471" />
    <PackageReference Include="System.Configuration.ConfigurationManager" Version="4.4.1" />
    <PackageReference Include="System.ServiceModel.Primitives" Version="4.4.2" />
    <ProjectReference Include="..\PRB.Extensions\PRB.Extensions.csproj">
      <SpecificVersion>True</SpecificVersion>
    </ProjectReference>
  </ItemGroup>

  <ItemGroup Condition="'$(TargetFramework)' == 'net461'">
    <Reference Include="Devart.Data, Version=5.0.1926.0, Culture=neutral, PublicKeyToken=09af7300eec23701, processorArchitecture=MSIL">
      <SpecificVersion>True</SpecificVersion>
      <Private>True</Private>
      <HintPath>C:\Program Files (x86)\Common Files\Devart\dotConnect\NET2\Devart.Data.dll</HintPath>
    </Reference>
    <Reference Include="Devart.Data.Linq, Version=4.8.1471.0, Culture=neutral, PublicKeyToken=09af7300eec23701, processorArchitecture=MSIL">
      <SpecificVersion>True</SpecificVersion>
      <Private>True</Private>
      <HintPath>C:\Program Files (x86)\Common Files\Devart\dotConnect\NET2\Devart.Data.Linq.dll</HintPath>
    </Reference>
    <Reference Include="Devart.Data.Oracle, Version=9.5.502.0, Culture=neutral, PublicKeyToken=09af7300eec23701, processorArchitecture=MSIL">
      <SpecificVersion>True</SpecificVersion>
      <Private>True</Private>
      <HintPath>C:\Program Files (x86)\Common Files\Devart\dotConnect\NET2\Devart.Data.Oracle.dll</HintPath>
    </Reference>
    <Reference Include="Devart.Data.Oracle.Linq, Version=4.8.1471.0, Culture=neutral, PublicKeyToken=09af7300eec23701, processorArchitecture=MSIL">
      <SpecificVersion>True</SpecificVersion>
      <Private>True</Private>
      <HintPath>C:\Program Files (x86)\Common Files\Devart\dotConnect\NET2\Devart.Data.Oracle.Linq.dll</HintPath>
    </Reference>
    <Reference Include="System.Configuration" Version="4.4.1" />
    <Reference Include="System.ServiceModel" Version="4.0.0" />
    <ProjectReference Include="..\PRB.WcfExtensions\PRB.WcfExtensions.csproj">
      <SpecificVersion>True</SpecificVersion>
    </ProjectReference>
    <ProjectReference Include="..\PRB.Extensions\PRB.Extensions.csproj">
      <SpecificVersion>True</SpecificVersion>
    </ProjectReference>
    <PackageReference Include="System.ValueTuple" Version="4.4.0" />
  </ItemGroup>

</Project>

How to limit version when building a package?

这是一个关于限制 ProjectReference 版本的已知问题。目前,semantic versioning 不支持 ProjectReference,因此我们无法像在 PackageReference.

上那样对 ProjectReference 设置版本上限

对于已知问题,请检查:Allow an upper limit Version for ProjectReference references in nupkg from dotnet pack to support semver

作为 解决方法,我们可以将 ProjectReference 转换为 PackageReference,然后使用 Version="[1.0.6]" 作为 PackageReference .

详细步骤:

1) 为项目PRB.ExtensionsPRB.WcfExtensions生成nuget包,获取包PRB.Extensions.1.0.6.nupkgPRB.WcfExtensions.1.0.0.nupkg.

2) 将这两个包设置为本地源,然后将它们安装到项目PRB.OracleExtensions,然后您将得到以下代码:

  <ItemGroup>
    <PackageReference Include="PRB.Extensions" Version="1.0.6" />
  </ItemGroup>

3) 将版本限制设置为 PackageReference:

  <ItemGroup Condition="'$(TargetFramework)' == 'net461'">
    <PackageReference Include="PRB.Extensions" Version="[1.0.6]" />
    <PackageReference Include="PRB.WcfExtensions" Version="[1.0.0]" />
  </ItemGroup>

  <ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
    <PackageReference Include="PRB.Extensions" Version="[1.0.6]" />
  </ItemGroup>

注意:当你使用PackageReference而不是ProjectReference时,你应该在将nuget包添加到项目之前删除ProjectReference PRB.OracleExtensions.