2017-04-02 35 views
3

我想收拾库作为NuGet包在PowerShell中,像这样:dotnet包 - 如何指定包的名称?

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" }, 

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

我看看this old question,但它看起来像是在谈论nuget工具,而不是dotnet工具。

是我唯一的选择重命名文件夹(这可能会导致很多其他东西现在打破),或者有另一种方式来指定dotnet pack命令的NuGet包名称?

在附注中,我已经在几个地方看过project.json即将消失,我们将回到.csproj,但目前尚不清楚何时生效。我应该打算消除project.json文件还是为时过早?

+0

重新迁移* .csproj':见[这里](https://docs.microsoft.com/en-us/dotnet/articles/core/migration/#migration -from-projectjson-to-csproj)和[这里](https://docs.microsoft.com/zh-cn/COM/EN-US/DOTNET /用品/核心/工具/项目JSON到的csproj)。 – mklement0

+0

@ mklement0 - 谢谢。但正如LexLi已经指出的那样,这些功能还没有完全发挥作用。我宁愿不为另一个部分工作的解决方案交易 - 特别是如果它意味着放弃可以同时适用于.NET标准和.NET Framework并且返回到.nuspec文件并且每个项目有2个不同构建命令的单个“dotnet pack”命令(用于2个不同的.csproj文件)。 – NightOwl888

回答

0

元数据中的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> 

+0

是的,我刚刚发现该文档。但我仍然感到困惑。其他人在该项目上设置.NET标准支持。有两个不同的解决方案文件 - 一个用于.NET Framework,一个用于.NET Core。 .csproj文件的目标是.NET Framework,而不是.NET Core。那么,我将如何在这个世界上融合这些? – NightOwl888

+1

@ NightOwl888请为它们使用两个单独的csproj文件,并仅对.NET Core csproj进行打包。就像我们过去如何定位整个CF和CF。一旦Microsoft使用csproj实现多个目标框架支持,那么您可能会开始合并。 –

+0

嗯...我认为你链接到的文件意味着多个目标已经被支持......?如果尚未完成,我认为我不会花时间将project.json文件转换为.NET Standard的.csproj。这不仅不会让我不必担心命名项目文件之间的冲突,而是使构建脚本将一个项目(31个中)复制到NuGet包的正确名称的新文件夹中的工作要少得多。 – NightOwl888

1

由于莱克斯李毅中指出,该工具仍处于进展中的工作,我想出了一个骇人听闻的解决方案,不会迫使我不得不再次使用.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 
} 
从`project.json`到`