Skip to content

ReferenceCopyLocalPaths no longer content NuGetSourceType metadata #3662

Open
@rainersigwald

Description

@rainersigwald

From @joeltankam on Friday, September 20, 2019 2:22:39 PM

Steps to reproduce

I encounter some missing metadata to ReferenceCopyLocalPaths item since migrating to Microsoft.NET.Sdk format in project files.

Lets consider the following project file :

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

  <PropertyGroup>
    <TargetFramework>net471</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Newtonsoft.Json" Version="12.0.2" />
  </ItemGroup>

</Project>

I use the following code to print metadata from ReferenceCopyLocalPaths items :

  <UsingTask TaskName="GetMetadataTask" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" >
    <ParameterGroup>
      <Items ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="true" />
      <MetadataString Output="true" />
    </ParameterGroup>
    <Task>
      <Using Namespace="System"/>
      <Code Type="Fragment" Language="cs">
        <![CDATA[
            StringBuilder metadata = new StringBuilder();
            foreach (var item in Items)
            {
                metadata.AppendFormat("{0}\r\n", item);
                foreach (string name in item.MetadataNames)
                {
                    metadata.AppendFormat("  {0}={1}\r\n", name, item.GetMetadata(name));
                }
                metadata.AppendFormat("\r\n");
            }
            MetadataString = metadata.ToString();
        ]]>
      </Code>
    </Task>
  </UsingTask>

  <Target Name="_SetNuGetSourceTypeToCopyLocal" AfterTargets="ResolveAssemblyReferences">
    <ItemGroup>
      <PrintItems Include="@(ReferenceCopyLocalPaths)" Condition="'%(ReferenceCopyLocalPaths.NuGetPackageId)' != ''" />
    </ItemGroup>
    <GetMetadataTask Items="@(PrintItems)">
      <Output TaskParameter="MetadataString" PropertyName="MyBeautifulMetadata"/>
    </GetMetadataTask>
    <Message Importance="High" Text="$(MyBeautifulMetadata)" />
  </Target>

Expected behavior

When using old project files format, I had the following metadata :

  ItemName=C:\Users\joel.tankam\.nuget\packages\newtonsoft.json\12.0.2\lib\net45\Newtonsoft.Json.dll
    NuGetPackageId=Newtonsoft.Json
    NuGetPackageVersion=12.0.2
    Private=false
    NuGetIsFrameworkReference=false
    NuGetSourceType=Package
    FullPath=C:\Users\joel.tankam\.nuget\packages\newtonsoft.json\12.0.2\lib\net45\Newtonsoft.Json.dll
    RootDir=C:\
    Filename=Newtonsoft.Json
    Extension=.dll
    RelativeDir=C:\Users\joel.tankam\.nuget\packages\newtonsoft.json\12.0.2\lib\net45\
    Directory=Users\joel.tankam\.nuget\packages\newtonsoft.json\12.0.2\lib\net45\
    RecursiveDir=
    Identity=C:\Users\joel.tankam\.nuget\packages\newtonsoft.json\12.0.2\lib\net45\Newtonsoft.Json.dll
    ModifiedTime=2019-04-22 01:06:16.0000000
    CreatedTime=2019-09-18 10:16:19.6451378
    AccessedTime=2019-09-18 10:16:19.6451378
    DefiningProjectFullPath=C:\MyBeautifulProject\Project.csproj
    DefiningProjectDirectory=C:\MyBeautifulProject\
    DefiningProjectName=Project
    DefiningProjectExtension=.csproj

Actual behavior

Now I get the following :

ItemName=C:\Users\joel.tankam\.nuget\packages\newtonsoft.json\12.0.2\lib\net45\Newtonsoft.Json.dll
    NuGetPackageId=Newtonsoft.Json
    NuGetPackageVersion=12.0.2
    FullPath=C:\Users\joel.tankam\.nuget\packages\newtonsoft.json\12.0.2\lib\net45\Newtonsoft.Json.dll
    RootDir=C:\
    Filename=Newtonsoft.Json
    Extension=.dll
    RelativeDir=C:\Users\joel.tankam\.nuget\packages\newtonsoft.json\12.0.2\lib\net45\
    Directory=Users\joel.tankam\.nuget\packages\newtonsoft.json\12.0.2\lib\net45\
    RecursiveDir=
    Identity=C:\Users\joel.tankam\.nuget\packages\newtonsoft.json\12.0.2\lib\net45\Newtonsoft.Json.dll
    ModifiedTime=2019-04-22 01:06:16.0000000
    CreatedTime=2019-09-18 10:16:19.6451378
    AccessedTime=2019-09-18 10:16:19.6451378
    DefiningProjectFullPath=C:\MyBeautifulProject\Project.csproj
    DefiningProjectDirectory=C:\MyBeautifulProject\
    DefiningProjectName=Project
    DefiningProjectExtension=.csproj

The difference being the absence of :

    Private=false
    NuGetIsFrameworkReference=false
    NuGetSourceType=Package

However, I need the NuGetSourceType metadata in my build process.
Is there please any reason why this this metadata disappeared ? Is there a way to set it back ?

I currently use this custom target to set back NuGetSourceType :

  <Target Name="_SetNuGetSourceTypeToCopyLocal" AfterTargets="ResolveReferences">
    <ItemGroup>
      <ReferenceCopyLocalPaths Update="@(ReferenceCopyLocalPaths)" Condition="'%(ReferenceCopyLocalPaths.NuGetPackageId)' != ''">
        <NuGetSourceType>Package</NuGetSourceType>
      </ReferenceCopyLocalPaths>
    </ItemGroup>
  </Target>

Environment data

msbuild /version output: 15.9.21.664
.NET Core SDK version : 2.2.108
Visual Studio : Professional 2017, v 15.9.16

Copied from original issue: dotnet/msbuild#4754

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions