我使用VS2013的NuGet Packager项目模板创建了一个NuGet包。我尝试使用Package.nuspec文件中的Replacement Tokens将bin\CONFIGURATION
文件夹中的DLL文件复制到nupkg文件的lib
文件夹中。
在Visual Studio中构建解决方案时,我在NuGet.log中收到以下错误:
[INFO] : Attempting to build package from 'Package.nuspec'. [ERROR] : System.InvalidOperationException: The replacement token 'configuration' has no value. [ERROR] : at NuGet.Preprocessor.ReplaceToken(String propertyName, IPropertyProvider propertyProvider, Boolean throwIfNotFound) [ERROR] : at NuGet.Preprocessor.Process(Stream stream, IPropertyProvider propertyProvider, Boolean throwIfNotFound) [ERROR] : at NuGet.Manifest.ReadFrom(Stream stream, IPropertyProvider propertyProvider, Boolean validateSchema) [ERROR] : at NuGet.PackageBuilder.ReadManifest(Stream stream, String basePath, IPropertyProvider propertyProvider) [ERROR] : at NuGet.PackageBuilder..ctor(String path, String basePath, IPropertyProvider propertyProvider, Boolean includeEmptyDirectories) [ERROR] : at NuGet.CommandLine.PackCommand.CreatePackageBuilderFromNuspec(String path) [ERROR] : at NuGet.CommandLine.PackCommand.BuildFromNuspec(String path) [ERROR] : at NuGet.CommandLine.PackCommand.BuildPackage(String path) [ERROR] : at NuGet.CommandLine.PackCommand.ExecuteCommand() [ERROR] : at NuGet.CommandLine.Command.ExecuteCommandAsync() [ERROR] : at NuGet.CommandLine.Command.Execute() [ERROR] : at NuGet.CommandLine.Program.MainCore(String workingDirectory, String[] args)
Package.nuspec的相关片段:
<package>
<files>
<file src="bin\$configuration$\$id$.dll" target="lib\net451\" />
我可以使用这个命令从命令行打包这个:
c:\Path\To\Project> nuget pack -Properties Package.nuspec
所以我在NuGetPackage.ps1中做了一些游戏并发现了这一部分:
# Create symbols package if any .pdb files are located in the lib folder
If ((Get-ChildItem *.pdb -Path .\lib -Recurse).Count -gt 0) {
$packageTask = Create-Process .\NuGet.exe ("pack Package.nuspec -Symbol -Verbosity Detailed")
$packageTask.Start() | Out-Null
$packageTask.WaitForExit()
$output = ($packageTask.StandardOutput.ReadToEnd() -Split '[\r\n]') |? {$_}
$error = (($packageTask.StandardError.ReadToEnd() -Split '[\r\n]') |? {$_})
Write-Log $output
Write-Log $error Error
$global:ExitCode = $packageTask.ExitCode
}
Else {
$packageTask = Create-Process .\NuGet.exe ("pack Package.nuspec -Verbosity Detailed")
$packageTask.Start() | Out-Null
$packageTask.WaitForExit()
$output = ($packageTask.StandardOutput.ReadToEnd() -Split '[\r\n]') |? {$_}
$error = (($packageTask.StandardError.ReadToEnd() -Split '[\r\n]') |? {$_})
Write-Log $output
Write-Log $error Error
$global:ExitCode = $packageTask.ExitCode
}
我看到NuGet.exe命令的创建位置,因此我将其修改为:
$packageTask = Create-Process .\NuGet.exe ("pack -Properties Package.nuspec -Verbosity Detailed")
然后我得到:
NuGet.CommandLineException:请指定要使用的nuspec或项目文件。
我删除了文件路径的$configuration$\
段,然后我得到了:
替换令牌&#39; id&#39;没有价值
更新:我在NuGetPackage.ps1中用我的项目的.csproj文件的名称替换了Package.nuspec
,现在通过Visual Studio构建正确创建了.nupkg文件。不过,我并不是每个NuGet包都这样做。
从Visual Studio而不是命令行构建时,如何在Package.nuspec
中使用替换标记?
答案 0 :(得分:0)
我找到了解决方法。在Visual Studio中将 NuGet Packager 项目模板中包含的项目打包的默认power shell脚本打包.nuspec
文件。将其更改为我项目的.csproj
文件修复了问题,我必须在两个地方执行此操作:
# Create symbols package if any .pdb files are located in the lib folder
If ((Get-ChildItem *.pdb -Path .\lib -Recurse).Count -gt 0) {
$packageTask = Create-Process .\NuGet.exe ("pack YourProject.csproj -Symbol -Verbosity Detailed")
// ...
}
Else {
$packageTask = Create-Process .\NuGet.exe ("pack YourProject.csproj -Verbosity Detailed")
// ...
}
它并非100%理想,因为NuGet Packager项目并不是完美的开箱即用,但这只是一个简单的改变。
注意PowerShell构建脚本从pack Package.nuspec
到pack YourProject.csproj
的更改,您可以将YourProject.csproj
替换为NuGet包项目的.csproj文件。