27

我正在为这个 MSBuild 问题而烦恼。

我们正在使用 TeamCity 构建一个包含两个 MVC 网站的解决方案。作为构建的一部分,我们将部署到构建服务器上的文件夹。IIS 指向此文件夹,以便为我们提供对管理层可见的集成构建。

这是使用 MSDeploy 发布包的 MSBuild 文件中的代码 - 但不是作为 zip 文件。

<Target Name="Deploy">
  <MSBuild 
    Projects="$(SolutionFile)"
    Properties="Platform=$(Platform);Configuration=$(Configuration);
    DeployOnBuild=true;
    DeployTarget=Package;
    PackageLocation=$(PackageLocation);
    PackageAsSingleFile=False;
    AutoParameterizationWebConfigConnectionStrings=False" />
</Target>

这里的问题是我们得到了一个非常深的文件夹结构。这是一个例子......

C:\DEPLOY\Archive\Content\C_C\Users\Edmond\Documents\Visual Studio 2008\CreatioGreen\Creatio\Code\core\trunk\Website\Website\obj\Release\Package\PackageTmp[已发布文件]

我真的很想部署到可预测的文件夹中,例如...

C:\build\website[已发布文件] C:\build\mobilewebsite[已发布文件]

这就是背景。以下是具体问题。

  1. 我们在尝试使用 MSDeploy 发布到本地文件系统时是否犯了错误?我们基本上需要具有配置转换的 VS2010“发布”功能。我们不会尝试部署到远程 IIS 实例或任何东西。

  2. 除了指定发布文件夹之外,有没有办法做到这一点?

  3. 我一直在尝试使用 MSBuild Copy 任务将文件复制到更合理的文件夹中 - 但我无法弄清楚如何使用通配符来指定我们需要使用的文件夹 - 它需要类似于......

C:\FolderPackageEndsUpIn[ANYFOLDERS]\网站[ANYFOLDERS]\PackageTmp* *。

帮助!

4

3 回答 3

30

如果将 _PackageTempDir 参数添加到 MSBuild,它将为您提供与进行本地发布相同的结果。例如

msbuild C:\PathToMyProj.csproj /p:Configuration=UAT;DeployOnBuild=true;PackageAsSingleFile=False;DeployTarget=Package;_PackageTempDir=c:\PathToMyDeploy\;AutoParameterizationWebConfigConnectionStrings=false

此命令会将我的所有文件发布到 c:\PathToMyDeploy\ 没有疯狂的子文件夹

于 2012-07-09T04:37:23.000 回答
4

您可以直接使用 WebDeploy 来获得更优化的结果。例如,您可以使用以下命令将 2 个文件夹直接同步到根目录:

>"%ProgramFiles%\IIS\Microsoft Web Deploy\msdeploy.exe" -verb:sync -source:dirPath=<SourceFolder> -dest:dirPath=<DestinationFolder>

或者,您可以使用 iisApp 提供程序而不是 dirPath 使 WebDeploy 在目标上包含 IIS 配置:

>"%ProgramFiles%\IIS\Microsoft Web Deploy\msdeploy.exe" -verb:sync -source:iisApp=<SourceFolderOrIISPath> -dest:iisApp=<DestinationFolderOrIISPath>

例如,要从一个简单的文件夹同步到默认网站下的新应用程序“NewApp”,您将这样调用它:

>"%ProgramFiles%\IIS\Microsoft Web Deploy\msdeploy.exe" -verb:sync -source:iisApp="d:\MyWebSite" -dest:iisApp="Default Web Site/NewApp"

然后,您可以拥有一个批处理文件,该文件将通过直接调用 WebDeploy 来执行同步/打包,并将作为构建后事件执行。

于 2010-11-17T19:41:00.173 回答
3

有一个稍微隐藏但优雅的解决方案。

在共享 CI 服务器上运行构建时,出于隔离原因,可能很难将其打包到 c:root 中。人们最终宁愿删除包本身的深层路径。

幸运的是,有一个解决方案。在 .pubxml 文件中添加替换规则!我在第二版内部 ms 构建引擎的补充中找到了它:https ://www.microsoft.com/learning/en-us/book.aspx?ID=16854

我还在这个博客中找到了它:http: //learnaspmvc.blogspot.se/2014/07/web-packaging-fixing-long-path-issue.html

于 2015-02-19T14:57:09.747 回答