【问题标题】:change output directory of nuget package更改nuget包的输出目录
【发布时间】:2016-03-09 13:30:49
【问题描述】:

我从我的项目中创建了一个 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 documentation

标签: .net nuget nuget-package


【解决方案1】:

以 NuGet 的“旧”方式(您似乎在使用,请查看 this 以获取有关新旧的信息),这可以通过使用您提到的 .nuget\NuGet.targets 文件中的命令来实现。如果您将带有 PackageOutputDir 的行更改为下面的行,它将起作用。

<PackageOutputDir Condition="$(PackageOutputDir) == ''">C:\LocalPackageRepository</PackageOutputDir>

最好在 .csproj 中的 PropertyGroup 上设置一个属性,如下所示:

<PackageOutputDir>C:\LocalPackageRepository</PackageOutputDir>

在 NuGet 的新方式中,您可以将此密钥添加到 NuGet.config 文件中:

<add key="repositoryPath" value="C:\LocalPackageRepository" />

【讨论】:

  • repositoryPath 的问题在于 NuGet 还希望依赖包位于那里,因此它的变化不仅仅是输出目录。
  • PackageOutputDir 在 2021 年在这里用 .net 6 制作的 nuget 项目中工作得很好。所以不会称之为“旧”方式。
【解决方案2】:

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

  • 在用户变量下创建环境变量:
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>

参考:Target build order

更新

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

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

【讨论】:

  • 注意nuget包的输出路径和build的输出路径不同。构建位于目标框架的目录中,nuget 包文件位于它们上方的一个目录中。例如。包在bin\Release\ OutputPathbin\Release\{targetframework}
  • @DouglasGaskell 是的,当然,目前我正在使用更新答案中提到的更简单的版本。
【解决方案3】:

您无法从 .nuspec 文件执行此操作。您可以创建一个 NuGet.Config 文件并为所有解决方案定义一个全局包目录:

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

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

【讨论】:

    猜你喜欢
    • 2020-06-24
    • 1970-01-01
    • 2013-04-21
    • 2017-01-30
    • 1970-01-01
    • 2022-11-11
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多