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

时间:2017-04-02 16:32:19

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

我正在尝试将一个库打包为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中处理项目)。上面的命令功能正常,但我最终得到了一个N​​uGet包名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

     

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

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

通过指定:

,我能够解决此问题的程序集名称
"buildOptions": { "outputName": "MyProject" },

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

我看了一下this old question,但看起来他们在讨论的是nuget工具,而不是dotnet工具。

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

另一方面,我在几个地方读过project.json即将离开,我们将回到.csproj,但目前还不清楚何时生效。我是否应该打算删除project.json文件,还是为时尚早?

3 个答案:

答案 0 :(得分:4)

答案 1 :(得分:2)

对于仍然有此问题的人

dotnet pack -p:PackageID=my_id

答案 2 :(得分:1)

由于Lex Li指出工具仍在进行中,我想出了一个不会强迫我不得不再次使用.nuspec文件的hackish解决方案(并且重新安排了该项目)只是为了让它发挥作用。

# 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
}