dotnet pack - 如何指定包的名称?

dotnet pack - How do you specify the name of the package?

我正在尝试将库打包为 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

PROJECT

The project to pack. It's either a path to a csproj file or to a directory. If omitted, it defaults to the current directory.

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

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

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

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

我看过 this old question,但他们似乎在谈论 nuget 工具,而不是 dotnet 工具。

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

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

元数据在 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>

由于 Lex Li 指出该工具仍在进行中,我提出了一个 hackish 解决方案,它不会迫使我不得不再次求助于 .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
}

对于仍然有此问题的人

dotnet pack -p:PackageID=my_id