使用NuGet包在TFS中使用多个目标框架构建项目 [英] Build project with multiple targetframeworks in TFS as a NuGet package

查看:97
本文介绍了使用NuGet包在TFS中使用多个目标框架构建项目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在我的TFS构建步骤之一中构建我的NuGet软件包。

I want to build my NuGet package in one of my TFS build steps.

由于TFS NuGet步骤当前不支持.NET Standard 2.0,因此我正在使用 / t:pack 作为我的MSBuild调用中的构建参数。

Because .NET Standard 2.0 is currently not supported by the TFS NuGet step, I am using /t:pack as the build argument in my MSBuild invocation.

当我仅使用一个 TargetFramework 正常工作。我的程序集也获得了版本,而我的NuGet包也得到了。
即使我在.NET Standard 2.0中使用AssemblyInfo.cs-在

When I only use one TargetFramework it is working fine. My assemblies get a version and my NuGet package too. Even if I am using an AssemblyInfo.cs in .NET Standard 2.0 - explained in this answer.

到目前为止没有问题,但是 if 我现在想基于两个不同的<$ c像< TargetFramework> netstandard2.0; net45< / TargetFramework> 这样的$ c> TargetFrameworks 我的NuGet软件包将不会获得版本。

So far no problem, but if I want to build now on two different TargetFrameworks like <TargetFramework>netstandard2.0;net45</TargetFramework> my NuGet package won't get a Version.

所以最后这是可行的,并且正在生成版本化的NuGet文件。

So in the end this is working and is generating a versioned NuGet file.

    <Project Sdk="Microsoft.NET.Sdk">

      <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
        <GeneratePackageOnBuild>false</GeneratePackageOnBuild>
        <GenerateNuspecDependsOn>$(GenerateNuspecDependsOn);ReadPackageVersionFromOutputAssembly</GenerateNuspecDependsOn>
        <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
      </PropertyGroup>

      <Target Name="ReadPackageVersionFromOutputAssembly" DependsOnTargets="Build">
        <GetAssemblyIdentity AssemblyFiles="$(TargetPath)">
          <Output TaskParameter="Assemblies" ItemName="PackAssembly" />
        </GetAssemblyIdentity>
        <PropertyGroup>
          <PackageVersion>%(PackAssembly.Version)</PackageVersion>
        </PropertyGroup>
      </Target>

      <ItemGroup>
        <Compile Remove="AccessControl\**" />
        <EmbeddedResource Remove="AccessControl\**" />
        <None Remove="AccessControl\**" />
      </ItemGroup>

      <ItemGroup>
        <Compile Include="..\common\Version.cs" Link="Properties\Version.cs" />
      </ItemGroup>

      <ItemGroup>
        <PackageReference Include="System.Threading.Tasks.Dataflow" Version="4.8.0" />
      </ItemGroup>

      <ItemGroup>
        <Reference Include="MyEngine">
          <HintPath>..\libs\NetStandard\MyEngine.dll</HintPath>
        </Reference>
      </ItemGroup>

      <ItemGroup>
        <Folder Include="Properties\" />
      </ItemGroup>

    </Project>

这是我当前的.csproj文件。这也会生成并生成一个NuGet文件。但是在这种情况下,我的NuGet文件未版本化。为什么要这样,我该如何解决?

So here is my current .csproj file. This builds too and also generates a NuGet file. But in this case my NuGet file is unversioned. Why is it this way and how can I fix it?

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFrameworks>netstandard2.0;net45</TargetFrameworks>
    <GeneratePackageOnBuild>false</GeneratePackageOnBuild>
    <GenerateNuspecDependsOn>$(GenerateNuspecDependsOn);ReadPackageVersionFromOutputAssembly</GenerateNuspecDependsOn>
    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
  </PropertyGroup>

  <Target Name="ReadPackageVersionFromOutputAssembly" DependsOnTargets="Build">
    <GetAssemblyIdentity AssemblyFiles="$(TargetPath)">
      <Output TaskParameter="Assemblies" ItemName="PackAssembly" />
    </GetAssemblyIdentity>
    <PropertyGroup>
      <PackageVersion>%(PackAssembly.Version)</PackageVersion>
    </PropertyGroup>
  </Target>

  <ItemGroup>
    <Compile Remove="AccessControl\**" />
    <EmbeddedResource Remove="AccessControl\**" />
    <None Remove="AccessControl\**" />
  </ItemGroup>

  <ItemGroup>
    <Compile Include="..\common\Version.cs" Link="Properties\Version.cs" />
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="System.Threading.Tasks.Dataflow" Version="4.8.0" />
  </ItemGroup>

  <ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
    <Reference Include="MyEngine">
      <HintPath>..\libs\NetStandard\MyEngine.dll</HintPath>
    </Reference>
  </ItemGroup>

  <ItemGroup Condition="'$(TargetFramework)' == 'net45'">
    <Reference Include="MyEngine">
      <HintPath>..\libs\NET45\MyEngine.dll</HintPath>
    </Reference>
  </ItemGroup>

  <ItemGroup>
    <Folder Include="Properties\" />
  </ItemGroup>

</Project>


推荐答案

可以调整目标以支持多目标,例如此:

The targets can be adapted to support multi-targeting like this:

<Target Name="ReadPackageVersionFromOutputAssemblySingleTfm" Returns="@(PackAssembly)" Condition="'$(IsCrossTargetingBuild)' != 'true'">
  <GetAssemblyIdentity AssemblyFiles="$(TargetPath)">
    <Output TaskParameter="Assemblies" ItemName="PackAssembly" />
  </GetAssemblyIdentity>
  <PropertyGroup>
    <PackageVersion>%(PackAssembly.Version)</PackageVersion>
  </PropertyGroup>
</Target>

<Target Name="ReadPackageVersionFromOutputAssemblyMultipleTfms" Condition="'$(IsCrossTargetingBuild)' == 'true'">
  <PropertyGroup>
    <FirstTargetFramework>$([System.String]::Copy($(TargetFrameworks)).Split(';').GetValue(0))</FirstTargetFramework>
  </PropertyGroup>
  <MSBuild Projects="$(MSBuildProjectFullPath)" Targets="ReadPackageVersionFromOutputAssemblySingleTfm" Properties="TargetFramework=$(FirstTargetFramework)">
    <Output TaskParameter="TargetOutputs" ItemName="PackAssembly" />
  </MSBuild>
  <PropertyGroup>
    <PackageVersion>%(PackAssembly.Version)</PackageVersion>
  </PropertyGroup>
</Target>

<Target Name="ReadPackageVersionFromOutputAssembly" DependsOnTargets="Build;ReadPackageVersionFromOutputAssemblySingleTfm;ReadPackageVersionFromOutputAssemblyMultipleTfms" />

这篇关于使用NuGet包在TFS中使用多个目标框架构建项目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆