我正在尝试将一个库打包为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
要打包的项目。它是csproj文件或目录的路径。如果省略,则默认为当前目录。
那么为什么如果我指定csproj的路径,它会查找project.json文件吗?
通过指定:
,我能够解决此问题的程序集名称"buildOptions": { "outputName": "MyProject" },
但是pack命令完全忽略了这一点。似乎也没有在packOptions
部分指定NuGet包名称的选项。
我看了一下this old question,但看起来他们在讨论的是nuget工具,而不是dotnet工具。
我唯一的选择是重命名文件夹(现在可能会导致很多其他内容破坏),还是有另一种方法来为dotnet pack
命令指定NuGet包名?
另一方面,我在几个地方读过project.json
即将离开,我们将回到.csproj
,但目前还不清楚何时生效。我是否应该打算删除project.json
文件,还是为时尚早?
答案 0 :(得分:4)
元数据在csproj中指定,如文档所述,
ListView
答案 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
}