使用msbuild,如何生成一次,然后使用多个转换配置文件发布?

使用msbuild,如何生成一次,然后使用多个转换配置文件发布?,msbuild,web-deployment,Msbuild,Web Deployment,我有一个.net解决方案,可以使用msbuild构建,并成功生成一个带有PublishProfile.pubxml转换的部署包,用于部署到单个web服务器 我需要为不同的环境构建和生成部署包,这些包使用各种.pubxml概要文件设置为转换 我知道我可以分别构建每个概要文件,向构建中注入更改的风险可以忽略不计,但不需要消耗时间和空间。无论如何,我只会保留其中的一个,只需将每个转换中唯一的web.configs复制到它们自己的部署包文件夹中(如果不清楚,很抱歉,请澄清) 我正在寻找类似伪代码的东西,

我有一个.net解决方案,可以使用
msbuild
构建,并成功生成一个带有
PublishProfile.pubxml
转换的部署包,用于部署到单个web服务器

我需要为不同的环境构建和生成部署包,这些包使用各种
.pubxml
概要文件设置为转换

我知道我可以分别构建每个概要文件,向构建中注入更改的风险可以忽略不计,但不需要消耗时间和空间。无论如何,我只会保留其中的一个,只需将每个转换中唯一的
web.config
s复制到它们自己的部署包文件夹中(如果不清楚,很抱歉,请澄清)

我正在寻找类似伪代码的东西,我知道它在语法上是不正确的,但应该能够理解这一点:

//步骤1
msbuild myapp.csproj target=Build
//步骤2
foreach($profileList中的profile){
msbuild myapp.csproj outputdir=“releaseDir/$profile”target=Publish publishProfile=$profile
}
我在Jenkins环境中工作,不能使用Visual Studio函数,除非它们作为命令行选项可用

我还拼命想让
msdeploy
工作,我想这可能会简化一些,但就我的一生而言,我无法让它与
tempAgent
选项一起工作,这是我在我的环境中真正想要的唯一方法。关于那场斗争的细节

提前谢谢

更新1:,但正如我在评论中所说的,它仍在创建多个部署包,这些包占用大量空间,并且不是必需的。我真正想要的是一种使用单个构建工件并创建Web.config文件的多个转换的方法。然后在部署时,复制构建工件和相应的配置文件。这真的是一次构建/多次部署

FWIW,这是我使用上面的链接得到的代码:

function Initialize-Build {
  $ErrorActionPreference = 'Stop'
  $appName = 'myApp'
  $projsToBuild = 'Ui', 'DataService'
  $projPath = "$appName/$appName"
  $buildPath = 'obj/Release/Package/'
  $releasePath = 'Release-Packages'

  $commonArgs = '/p:Configuration=Release',
    '/nologo',
    '/verbosity:quiet'
}

function Invoke-Build {
  foreach ($proj in $projsToBuild) {
    $projName = $proj -eq 'Ui' ? 'WebUi' : $proj
    $p = "$projPath.$proj/$appName.$projName.csproj"

    $buildArgs = '/t:Clean,Build',
      '/p:AutoParameterizationWebConfigConnectionStrings=False'

    Write-Output "Building $p"
    msbuild $p @commonArgs @buildArgs
    if ($LASTEXITCODE) { exit 1 }
  }
}

function Invoke-Transform {
  $xformArgs = "/p:deployOnBuild=True", "/p:Targets=Publish"

  foreach ($proj in $projsToBuild) {
    $p = "$projPath.$proj/$appName.$projName.csproj"

    $pubProfiles = 'Dev', 'QA', 'UAT', 'Prod'
    foreach ($prof in $pubProfiles) {  
      Write-Output "Building $p ($prof)"
      $pubProfileArg = "/p:PublishProfile=$prof"

      msbuild $p @commonArgs @xformArgs $pubProfileArg
      if ($LASTEXITCODE) { exit 1 }
    }  
  }
}

. Initialize-PrivLogBuild

Invoke-Build

Invoke-Transform

我意识到我问的问题并不正确。当我开始搜索msbuild转换帖子时,我找到了一种方法来完成我需要的工作

我用
AfterBuild
目标更新了我正在构建的应用程序的.csproj文件

需要4个转换,每个转换都有自己的.config文件作为转换源。我很幸运,这些文件已经由应用程序开发人员创建

这是我最后使用的代码,放在.csproj文件的末尾,在
标记中。为了减少路径和文件名的重复,我创建了
configDir
xformFile
属性。我喜欢这种模式,因为它很容易扩展和通用


../../Release Packages/configs
Web.config
非常感谢这些帖子为这个解决方案指明了道路