NuGet:替换令牌'配置'构建Visual Studio解决方案

时间:2016-01-19 21:51:04

标签: powershell visual-studio-2013 nuget nuget-package

我使用VS2013的NuGet Packager项目模板创建了一个NuGet包。我尝试使用Package.nuspec文件中的Replacement Tokensbin\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中使用替换标记?

1 个答案:

答案 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.nuspecpack YourProject.csproj的更改,您可以将YourProject.csproj替换为NuGet包项目的.csproj文件。