更改NuGet包的输出目录

6

我从我的项目创建了一个NuGet包。该包的输出目录是解决方案目录。我希望将其输出到特定目录。我在csproj文件和nuspec文件中尝试了一个目标,但都没用。如何让包生成在指定的文件夹中?

在我的.csproj文件中:

<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
  <PropertyGroup>
    <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
  </PropertyGroup>
  <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
</Target>

在我的.nuspec文件中:
<?xml version="1.0"?>
<package >
  <metadata>
    <id>MyPackage.dll</id>
    <version>1.0.0</version>
    <authors>me</authors>
    <owners>me</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Package description</description>
    <releaseNotes>Summary of changes made in this release of the package.</releaseNotes>
    <copyright>Copyright 2016</copyright>
    <files>
      <file src="bin\MyPackage.dll" target="C:\LocalPackageRepository" />
    </files>
  </metadata>
</package>

你不能从.nuspec文件中执行此操作。你可以创建一个NuGet.Config文件,并为所有解决方案定义一个全局包目录。这是在.nupkg文件之外完成的,可以存储在你的个人资料下或者是一个包含所有解决方案目录的父目录下的子目录中。请参阅NuGet文档中关于此功能的说明。 - Matt Ward
4个回答

4

1
repositoryPath 的问题在于 NuGet 还期望依赖包位于那里,因此它会更改的不仅仅是输出目录。 - Jez
PackageOutputDir在2021年的.NET 6中制作的NuGet项目中完全正常。因此,我不会称其为“旧”的方式。 - Cine
1
我在VS 2022 17.3中不得不使用PackageOutputPath - Dave

3

我不确定为什么全局配置设置对我没有起作用,但是添加下面的解决方案解决了我的问题:

  • 在用户变量下创建一个环境变量:
Variable name: MyNugetsOutput
Variable value: D:\myteam\teampackages
  • 然后在.csproj文件中添加以下设置:
<Target Name="CopyPackage" AfterTargets="Pack">
  <Copy SourceFiles="$(OutputPath)\$(PackageId).$(PackageVersion).nupkg"
        DestinationFolder="$(MyNugetsOutput)\$(PackageId).$(PackageVersion).nupkg" />
</Target>

参考链接:目标构建顺序

更新

目前我正在使用以下代码,它更简单但会将所有的 .nupkg 文件复制到“Local”路径下:

<Target Name="AfterPack" AfterTargets="Pack">
    <Exec Command="dotnet nuget push $(PackageOutputPath)*.nupkg --source Local" />
</Target>

请注意,NuGet包的输出路径和构建的输出路径是不同的。构建文件位于目标框架所在的目录中,而NuGet包文件则位于它们的上一级目录中。例如,包位于bin\Release\,而OutputPathbin\Release\{targetframework} - Douglas Gaskell
@DouglasGaskell 当然可以,目前我正在使用更新答案中提到的简化版本。 - LazZiya

0

你不能从 .nuspec 文件中完成这个操作。你可以创建一个 NuGet.Config 文件,并为所有解决方案定义一个全局的包目录:

<configuration>
  <config>
    <add key="repositoryPath" value="C:\myteam\teampackages" />
  </config>
  ... 
</configuration>

这是在 .nupkg 文件之外完成的,并存储在您的个人资料或包含解决方案的所有目录的父目录中的子目录中。有关此功能的更多详细信息,请参阅 NuGet 文档


0
作为一种替代方案,您可以使用msbuild/VS将一个或多个项目打包,并使用NuGet add或NuGet init将它们复制/发布到本地的NuGet feed中:
nuget add .\bin\debug\MyPackage.nupkg -source c:\LocalPackageRepository
NuGet init只会从当前目录中获取,所以我使用了类似这样的命令:
echo "Start"
$packages = Get-ChildItem "C:\source\repos\Projects\*.nupkg" -Recurse -Force
echo "packages to publish =" $packages
ForEach ($p in $packages)
{
    echo $p
    nuget add $p -Source C:\source\NuGetLocal
}
echo "End"

https://learn.microsoft.com/en-us/nuget/hosting-packages/local-feeds


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接