我已经基本上做到了没有自定义的msbuild脚本,以下是相关的TeamCity构建配置设置:
Artifact paths: %system.teamcity.build.workingDir%\MyProject\obj\Debug\Package\PackageTmp
Runner类型:MSBuild (用于MSBuild文件的运行器)
生成文件路径:MyProject\MyProject.csproj
工作目录:与检出目录相同
MSBuild版本:Microsoft .NET Framework 4.0
MSBuild ToolsVersion版本:4.0
运行平台:x86
Targets:Package
传递给MSBuild.exe的命令行参数:/p:Configuration=Debug
这将编译、打包(带有web.config转换)并将输出保存为构件。唯一缺少的是将输出复制到指定位置,但可以通过另一个具有构件依赖项的TeamCity构建配置或使用msbuild脚本来完成。
更新
这里有一个msbuild脚本,将编译、打包(带有web.config转换)并将输出复制到我的临时服务器上。
<?xml version="1.0" encoding="utf-8" ?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
<SolutionName>MySolution</SolutionName>
<SolutionFile>$(SolutionName).sln</SolutionFile>
<ProjectName>MyProject</ProjectName>
<ProjectFile>$(ProjectName)\$(ProjectName).csproj</ProjectFile>
</PropertyGroup>
<Target Name="Build" DependsOnTargets="BuildPackage;CopyOutput" />
<Target Name="BuildPackage">
<MSBuild Projects="$(SolutionFile)" ContinueOnError="false" Targets="Rebuild" Properties="Configuration=$(Configuration)" />
<MSBuild Projects="$(ProjectFile)" ContinueOnError="false" Targets="Package" Properties="Configuration=$(Configuration)" />
</Target>
<Target Name="CopyOutput">
<ItemGroup>
<PackagedFiles Include="$(ProjectName)\obj\$(Configuration)\Package\PackageTmp\**\*.*"/>
</ItemGroup>
<Copy SourceFiles="@(PackagedFiles)" DestinationFiles="@(PackagedFiles->'\\build02\wwwroot\$(ProjectName)\$(Configuration)\%(RecursiveDir)%(Filename)%(Extension)')"/>
</Target>
</Project>
你也可以从PropertyGroup标签中删除SolutionName和ProjectName属性,并将它们通过msbuild传递。
msbuild build.xml /p:Configuration=Deploy
更新2
由于这个问题仍然有很多流量,我认为值得更新一下我的答案,介绍我目前使用的脚本,它使用Web Deploy(也称为MSDeploy)。
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build" ToolsVersion="4.0">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
<ProjectFile Condition=" '$(ProjectFile)' == '' ">$(ProjectName)\$(ProjectName).csproj</ProjectFile>
<DeployServiceUrl Condition=" '$(DeployServiceUrl)' == '' ">http://staging-server/MSDeployAgentService</DeployServiceUrl>
</PropertyGroup>
<Target Name="VerifyProperties">
<!-- Verify that we have values for all required properties -->
<Error Condition=" '$(ProjectName)' == '' " Text="ProjectName is required." />
</Target>
<Target Name="Build" DependsOnTargets="VerifyProperties">
<!-- Deploy using windows authentication -->
<MSBuild Projects="$(ProjectFile)"
Properties="Configuration=$(Configuration);
MvcBuildViews=False;
DeployOnBuild=true;
DeployTarget=MSDeployPublish;
CreatePackageOnPublish=True;
AllowUntrustedCertificate=True;
MSDeployPublishMethod=RemoteAgent;
MsDeployServiceUrl=$(DeployServiceUrl);
SkipExtraFilesOnServer=True;
UserName=;
Password=;"
ContinueOnError="false" />
</Target>
</Project>
在TeamCity中,我有名为
env.Configuration
、
env.ProjectName
和
env.DeployServiceUrl
的参数。MSBuild运行程序具有构建文件路径,并且参数会自动传递(您无需在命令行参数中指定它们)。
您还可以从命令行中运行它:
msbuild build.xml /p:Configuration=Staging