【问题标题】:dotnet pack - How do you specify the name of the package?dotnet pack - 你如何指定包的名称?
【发布时间】:2017-08-27 11:58:05
【问题描述】:

我正在尝试在 powershell 中将库打包为 NuGet 包,如下所示:

function Create-NuGetPackages($projects) {

    if (!(Test-Path $NuGetPackageDirectory)) {
        New-Item $NuGetPackageDirectory -ItemType Directory
    }
    
    foreach ($project in $projects) {
        pushd $project.DirectoryName

        & dotnet.exe pack --configuration $Configuration --output $NuGetPackageDirectory --no-build

        popd
    }

    return $NuGetPackageDirectory
}

该项目正在使用project.json.xproj 文件(还有一个.csproj 文件用于在.NET 4.5.1 中处理该项目)。上面的命令功能,但我最终得到一个 NuGet 包名称 MyProject.Core,我需要它是 MyProject 以匹配旧包。

该项目是一个端口,最明智的做法是以Java包命名文件夹,即MyProject.Core,但我似乎无法弄清楚如何让它生成一个不同的NuGet包名字。

我已尝试在 CLI 上使用此命令:

dotnet pack "src\MyProject.Core\MyProject.csproj" --output NuGetPackages\ --configuration "Release"

但它给出了错误:

Unable to find a project.json in src\MyProject.Core\MyProject.csproj\project.json

根据this page

项目

要打包的项目。它是 csproj 文件或目录的路径。如果省略,则默认为当前目录。

那么为什么如果我指定 csproj 的路径,它会查找 project.json 文件?

我能够通过指定以下内容来解决程序集名称的这个问题:

"buildOptions": { "outputName": "MyProject" },

但是 pack 命令完全忽略了这一点。在packOptions 部分中似乎也没有指定 NuGet 包名称的选项。

我查看了this old question,但看起来他们在谈论 nuget 工具,而不是 dotnet 工具。

我唯一的选择是重命名文件夹(现在可能会导致很多其他内容损坏),还是有另一种方法可以为 dotnet pack 命令指定 NuGet 包名称?

顺便说一句,我在几个地方读到project.json 即将消失,我们将回到.csproj,但尚不清楚何时生效。我应该以消除project.json 文件为目标还是为时过早?

【问题讨论】:

  • project.json重新迁移到*.csproj:见herehere
  • @mklement0 - 谢谢。但正如 LexLi 已经指出的那样,该功能仍未完全发挥作用。我宁愿不将一个部分工作的解决方案换成另一个 - 特别是如果这意味着放弃适用于 .NET Standard 和 .NET Framework 的单个 dotnet pack 命令并返回到 .nuspec 文件和每个项目的 2 个不同的构建命令(对于 2 个不同的 .csproj 文件)用于过渡。

标签: .net nuget .net-core dotnet-cli


【解决方案1】:

对于仍然有这个问题的人

dotnet pack -p:PackageID=my_id

【讨论】:

  • 这是现在的正确答案(老问题,所以当时可能还没有!)
  • 为什么在这里 (docs.microsoft.com/en-us/dotnet/core/tools/dotnet-pack) -p:PackageVersion 被记录但-p:PacjkageID 根本没有被提及?
  • @Alex75 你是对的,我们应该向维护者报告这个遗漏。
  • 这对任何人都有效吗?我尝试了dotnet pack -p:PackageId=asdfasdfasdfawg 并得到了error : Ambiguous project name 'asdfasdfasdfawg'。相信我,我不会有这样的名字的项目
  • 我能够通过首先正常构建解决方案(dotnet build)然后为特定项目和以下参数调用 dotnet pack 来使用不同的包 ID 打包:--no-build --无依赖 -p:PackageId=foo
【解决方案2】:

如文档所述,元数据在 csproj 中指定,

https://docs.microsoft.com/en-us/nuget/guides/create-net-standard-packages-vs2017#edit-metadata-in-the--csproj-file

<PropertyGroup>
 <TargetFramework>netstandard1.4</TargetFramework>
 <PackageId>AppLogger.YOUR_NAME</PackageId>
 <PackageVersion>1.0.0</PackageVersion>
 <Authors>YOUR_NAME</Authors>
 <Description>Awesome application logging utility</Description>
 <PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
 <PackageReleaseNotes>First release</PackageReleaseNotes>
 <Copyright>Copyright 2016 (c) Contoso Corporation. All rights reserved.</Copyright>
 <PackageTags>logger logging logs</PackageTags>
</PropertyGroup>

【讨论】:

  • 是的,我刚刚找到了那个文档。但我仍然很困惑。其他人在项目上设置了 .NET 标准支持。有 2 个不同的解决方案文件 - 一个用于 .NET Framework,一个用于 .NET Core。 .csproj 文件面向 .NET Framework,而不是 .NET Core。那么,我到底要如何合并这些?
  • @NightOwl888 请为它们使用两个单独的 csproj 文件,并且仅针对 .NET Core csproj 打包。就像我们过去如何瞄准完整和 CF 一样。一旦微软使用 csproj 实现了多目标框架支持,那么您可能会开始合并。
  • 嗯...我认为您链接到的文档意味着已经支持多个目标...?如果这还没有完成,我想我不会花时间将 project.json 文件转换为 .NET Standard 的 .csproj。它不仅使我不必担心项目文件之间的命名冲突,而且使构建脚本将一个项目(共 31 个)复制到具有正确名称的 NuGet 包的新文件夹中的工作要少得多。
  • @NightOwl888 各种消息来源表明“多目标框架支持”是存在的,但只是部分有效。就我个人而言,我宁愿等到微软正式宣布它功能完备。
  • 如果您想知道这些属性的来源,这里是docs
【解决方案3】:

由于 Lex Li 指出该工具仍在进行中,我想出了一个骇人听闻的解决方案,它不会迫使我不得不再次求助于 .nuspec 文件(以及对项目进行大量重新安排)让它工作。

# Hack because dotnet pack doesn't provide a way to override the directory
# name for the NuGet package name when using project.json. 
# So, we copy MyProject.Core to a new directory
# MyProject to work around this.
function Copy-MyProject() {
    Copy-Item -Recurse -Force "$root\src\MyProject.Core" "$ReleaseDirectory\MyProject"
}

function Delete-MyProject-Copy() {
    Remove-Item "$ReleaseDirectory\MyProject" -Force -Recurse -ErrorAction SilentlyContinue
}

function Create-NuGetPackages($projects) {

    try
    {
        Copy-MyProject
        $projects = $projects += Get-ChildItem -Path "$ReleaseDirectory\MyProject\project.json"
        $projects = $projects | ? { !$_.Directory.Name.Equals("MyProject.Core") }

        if (!(Test-Path $NuGetPackageDirectory)) {
            New-Item $NuGetPackageDirectory -ItemType Directory
        }

        foreach ($project in $projects) {
            pushd $project.DirectoryName

            Write-Host "Creating NuGet package for $project..." -ForegroundColor Magenta

            & dotnet.exe pack --configuration $Configuration --output $NuGetPackageDirectory --no-build

            popd
        }
    } finally {
        Delete-MyProject-Copy
    }

    return $NuGetPackageDirectory
}

【讨论】:

    猜你喜欢
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 2017-03-02
    • 1970-01-01
    • 2016-11-08
    • 2017-03-16
    • 2014-12-02
    相关资源
    最近更新 更多