tfs - 使用 TFS 中的多个目标框架将项目构建为 NuGet 包

标签 tfs msbuild nuget csproj

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

因为 TFS NuGet 步骤目前不支持 .NET Standard 2.0,所以我使用 /t:pack作为我的 MSBuild 调用中的构建参数。

当我只使用一个 TargetFramework它工作正常。我的程序集也有一个版本和我的 NuGet 包。 即使我在 .NET Standard 2.0 中使用 AssemblyInfo.cs - 在 this answer 中解释.

到目前为止没问题,但是如果我现在想在两个不同的 TargetFrameworks 上构建喜欢<TargetFramework>netstandard2.0;net45</TargetFramework>我的 NuGet 包不会获得版本。

所以最后这是有效的,并且正在生成版本控制的 NuGet 文件。

    <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 文件没有版本控制。为什么会这样,我该如何解决?

<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>

最佳答案

可以像这样调整目标以支持多目标:

<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" />

关于tfs - 使用 TFS 中的多个目标框架将项目构建为 NuGet 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48065516/

相关文章:

c# - 程序集从哪里加载?

c++ - 在 Visual Studio 2017 中找不到 nuget 包管理器?

git - Visual Studio git clone 始终对文件使用 LF

tfs - 有没有关于如何使用 TFS 构建软件的教程

c# - 引用错误 TFS & Nuget

tfs - VS 2013 发布管理 - 路径中存在非法字符

msbuild - TeamCity 和构建参数

msbuild - Microsoft.Build.Evaluation 的正确用法是什么?

jenkins - msbuild 与命令行与 Jenkins 的行为不同

nuget - Visual Studio 2017网站菜单 "Enable C# 6/VB 14"无法加载Nuget包