I have a Visual Studio solution which has several projects. One of them, which is called Extensions is supposed to build a Nuget package. Problem is that if I use MSBuild to build the solution (by executing msbuild
from the command prompt), I get the following error for the Nuget package build task:
"C:\git\repo\dirs.proj" (default target) (1:7) ->"C:\git\repo\sources\dirs.proj" (default target) (2:5) ->"C:\git\repo\sources\dev\Sdk\CompanyName.ProductName.Extensions.csproj" (default target) (7:6) ->(GenerateNuspec target) -> C:\Program Files\dotnet\sdk\5.0.408\Sdks\NuGet.Build.Tasks.Pack\build\NuGet.Build.Tasks.Pack.targets(221,5): error : Could not find a part of the path 'C:\git\ess\target\distrib\Debug\Amd64\CompanyName.ProductName.Extensions'. [C:\git\ess\sources\dev\Sdk\CompanyName.ProductName.Extensions.csproj]
Here is the CSPROJ file I have for this project:
<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><TargetFramework>netcoreapp3.1</TargetFramework><AssemblyName>CompanyName.ProductName.Extensions</AssemblyName><RootNamespace>CompanyName.ProductName.Extensions</RootNamespace><TargetsForTfmSpecificBuildOutput>$(TargetsForTfmSpecificBuildOutput);IncludeCoreAssets</TargetsForTfmSpecificBuildOutput><DebugType>full</DebugType><DebugSymbols>true</DebugSymbols><NuspecFile>CompanyName.ProductName.Extensions.nuspec</NuspecFile><PackageOutputPath>$(DistribRoot)\$(Configuration)\$(Platform)\$(MSBuildProjectName)</PackageOutputPath><GeneratePackageOnBuild>true</GeneratePackageOnBuild><SkipAssemblyComVisible>true</SkipAssemblyComVisible><IncludeBuildOutput>false</IncludeBuildOutput><OutputPath>$(DistribRoot)\$(Configuration)\$(Platform)\$(MSBuildProjectName)</OutputPath><AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath><NuspecBasePath>$(OutputPath)</NuspecBasePath></PropertyGroup><ItemGroup><ProjectReference Include="..\Core\CompanyName.ProductName.Core.csproj" PrivateAssets="All" /></ItemGroup><PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'"><PlatformTarget>x64</PlatformTarget></PropertyGroup><Target DependsOnTargets="ResolveReferences" Name="IncludeCoreAssets"><ItemGroup><BuildOutputInPackage Include="@(ReferenceCopyLocalPaths->WithMetadataValue('ReferenceSourceTarget', 'ProjectReference'))" /></ItemGroup></Target></Project>
I personally think the issue is that for some reason when MSbuild is trying to create the Nuget package, it's trying to find the Extensions project DLLs in this path: \target\distrib\Debug\Amd64\CompanyName.ProductName.Extensions\
, even though it actually built and stored the said binaries in this path earlier: \target\distrib\CompanyName.ProductName.Extensions\
. <--- This is something I checked manually myself by examining the 'target' folder after running msbuild
.
Visual Studio however doesn't have this issue. When I build this solution within Visual Studio, it stores the binaries for this Extensions project in \target\distrib\Debug\AnyCPU\CompanyName.ProductName.Extensions\
folder, which I think matches the pattern defined in the CSPROJ file:
<OutputPath>$(DistribRoot)\$(Configuration)\$(Platform)\$(MSBuildProjectName)</OutputPath>
Visual Studio also stored the Nuget package in this folder, which is also correct as per the <PackageOutputPath>
spec mentioned in the CSPROJ file.
So can someone suggest why MSbuild is storing the built DLLs of this project in \target\distrib\CompanyName.ProductName.Extensions\
, but is trying to find them in \target\distrib\Debug\Amd64\CompanyName.ProductName.Extensions\
?
I think the issue is that for some reason, MSbuild isn't adhering to the <OutputPath>
spec mentioned above when it's storing the built DLLs for this project.