我的预构建脚本最初是.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预建脚本的方法的任何好的参考?所有的例子都是批量编写的!
答案 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'