用PowerShell编写的MyGet预构建脚本?

时间:2017-08-23 07:06:55

标签: powershell myget

我的预构建脚本最初是.bat。当我添加了生成版本号的功能时,我在PowerShell中编写了它(我真的不喜欢批处理)。所以我试图将整个预构建脚本转换为PowerShell,但我遇到了困难。

## pre-build.ps1
function SetPackageVersion
{
    if(gitversion /output json /showvariable PreReleaseTagWithDash) 
    {
       ##myget[buildNumber "$(gitversion /output json /showvariable Major).$(gitversion /output json /showvariable Minor).$(gitversion /output json /showvariable CommitsSinceVersionSource)-$(gitversion /output json /showvariable PreReleaseTagWithDash)"] 
    } 
    else 
    {
       ##myget[buildNumber "$(gitversion /output json /showvariable Major).$(gitversion /output json /showvariable Minor).$(gitversion /output json /showvariable CommitsSinceVersionSource)"] 
    } 

    GitVersion /updateassemblyinfo true
}

set config=Release

SetPackageVersion

## Package restore
NuGet restore Library\packages.config -OutputDirectory %cd%\packages -NonInteractive

Build "%programfiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" MakeMeATable.sln /p:Configuration="%config%" /m /v:M /fl /flp:LogFile=msbuild.log;Verbosity=Normal /nr:false

## Package
mkdir Build
nuget pack "Library\MakeMeATable.csproj" -symbols -o Build -p Configuration=%config% %version%

我在MyGet构建日志(以及其他)中收到了这些错误

Build : The term 'Build' is not recognized as the name of a cmdlet, function, 
script file, or operable program. Check the spelling of the name, or if a path 
was included, verify that the path is correct and try again.
At D:\temp\fcd4ee1\pre-build.ps1:24 char:1
+ Build "%programfiles(x86)%\MSBuild\14.0\Bin\MSBuild.exe" MakeMeATable ...
+ ~~~~~
    + CategoryInfo          : ObjectNotFound: (Build:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

The term 'Verbosity=Normal' is not recognized as the name  of a cmdlet, function,
script file, or operable program. Check the spelling of the name, or if a path
was included, verify that the path is correct and try again.
At D:\temp\fcd4ee1\pre-build.ps1:24 char:140
+ ... onfig%" /m /v:M /fl /flp:LogFile=msbuild.log;Verbosity=Normal /nr:fal ...
+                                                  ~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (Verbosity=Normal:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

我不明白为什么我找不到关于为MyGet创建PowerShell预建脚本的方法的任何好的参考?所有的例子都是批量编写的!

  • 我错过了在线资源吗?
  • 在PowerShell中使用MyGet构建和打包库的正确(官方/最简单)方法是什么?

1 个答案:

答案 0 :(得分:1)

我没有使用MyGet的经验,但是我可以就错误和代码提供一些建议。

  •   

    构建:术语“构建”不被识别为cmdlet,函数,脚本文件或可操作程序的名称。

    解释器不会将Build识别为命令。它在哪里定义?它是别名吗?包含在哪里?不同路径中的可执行文件?此外,您的命令行看起来并不像首先需要的那样。尝试使用call operator&)替换它。

      

    术语“Verbosity = Normal”不被识别为cmdlet,函数,脚本文件或可操作程序的名称。

    PowerShell中的分号与批处理中的&符号具有相同的含义:它是菊花链命令的运算符。因为PowerShell尝试将Verbosity=Normal作为新语句执行,而不是将其作为参数/flp的参数的一部分来处理。将参数放在引号中以避免这种情况。

    此外,您不能在PowerShell中使用CMD内置变量(%cd%)或批量变量语法(%var%)。 %cd%的等效值为$pwd(更具体地说是$pwd.Path),general syntax for variables$var${var}(后者必须使用变量名包含非单词字符,如空格,圆括号等。)。

    将语句更改为以下内容:

    & "${ProgramFiles(x86)}\MSBuild\14.0\Bin\MSBuild.exe" MakeMeATable.sln "/p:Configuration=$config" /m /v:M /fl "/flp:LogFile=msbuild.log;Verbosity=Normal" /nr:false
    

    它应该有效。更好的是,使用splatting传递参数:

    $params = 'MakeMeATable.sln', "/p:Configuration=$config", '/m', '/v:M',
              '/fl', '/flp:LogFile=msbuild.log;Verbosity=Normal', '/nr:false'
    & "${ProgramFiles(x86)}\MSBuild\14.0\Bin\MSBuild.exe" @params
    
  • PowerShell和批处理中的变量分配是不同的。虽然set config=Release不会产生错误(因为set是cmdlet Set-Variable的内置别名),但它不会达到预期效果。它不是使用值config定义变量Release,而是定义一个空值的变量config=Release

    更改

    set config=Release
    

    $config = 'Release'