最近考虑做自动生成产品安装程序的流程,看看能否集成MS Build和Web 发布工具。在Web项目上,运行发布向导,执行配置,会在该项目的Properties\PublishProfiles目录下生成两个文件:{配置名称}.pubxml, {配置名称}.pubxml.user. 后一个文件是MSBuild的标准配置文件。
下面看了一下MS发布Web到底做了哪些事情。以发布到文件系统为例,主要步骤如下:
1. 验证基础配置信息
$(PackageAsSingleFile)为 True ...
2. 收集所有需要发布的文件
从项目项 @(IntermediateAssembly)中收集所有文件。正在添加:
从项目项 @(Content)中收集所有文件。正在添加:
从项目输出(IntermediateSatelliteAssembliesWithTargetPath)中收集所有文件。正在添加:
从项目项 @(ReferenceCopyLocalPaths,ReferenceComWrappersToCopyLocal,ResolvedIsolatedComModules,_DeploymentLooseManifestFile,NativeReferenceFile)中收集 所有文件。
从项目项 @(AllExtraReferenceFiles)中收集所有文件。正在添加:
从项目项 @(_binDeployableAssemblies)中收集所有文件。正在添加:
3. 执行Web.Config的转换。 如果发布的是配置是Debug, 则需要合并处理Web.Config 和Web.Debug.Config
obj\Debug\TransformWebConfig > obj\Debug\ProfileTransformWebConfig
4. 将所有文件都复制到以下临时位置以进行下一步处理 obj\Debug\AspnetCompileMerge\Source
....
正在将 D:\Reference\Microsoft.AspNet.Razor.2.0.30506.0\lib\net40\zh-Hans\System.Web.Razor.resources.dll 复制到 obj\Debug\AspnetCompileMerge\Source\bin\zh-Hans\System.Web.Razor.resources.dll。
正在将 D:\Reference\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\zh-Hans\System.Web.WebPages.resources.dll 复制到 obj\Debug\AspnetCompileMerge\Source\bin\zh-Hans\System.Web.WebPages.resources.dll。
正在将 D:\Reference\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\zh-Hans\System.Web.WebPages.Deployment.resources.dll 复制到 obj\Debug\AspnetCompileMerge\Source\bin\zh-Hans\System.Web.WebPages.Deployment.resources.dll。
正在将 D:\Reference\Microsoft.AspNet.WebPages.2.0.30506.0\lib\net40\zh-Hans\System.Web.WebPages.Razor.resources.dll 复制到 obj\Debug\AspnetCompileMerge\Source\bin\zh-Hans\System.Web.WebPages.Razor.resources.dll。
正在将 obj\Debug\TransformWebConfig\transformed\Web.config 复制到 obj\Debug\AspnetCompileMerge\Source\Web.config。
....
5. 如果选择了预编译,会将上一步的Source目录执行预编译到obj\Debug\AspnetCompileMerge\TempBuildDir。如果选择了合并程序集,则动态编译AssemblyInfo, 并将该属性附加到该程序集上
C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe -v / -p "{项目路径}\obj\Debug\AspnetCompileMerge\Source" -u -c "{项目路径}\obj\Debug\AspnetCompileMerge\TempBuildDir"
正在创建目录“obj\Debug\AssemblyInfo”。
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Csc.exe /out:obj\Debug\AssemblyInfo\AssemblyInfo.dll /target:library Properties\AssemblyInfo.cs
运行 aspnet_merge.exe。
C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\aspnet_merge.exe "{项目路径}\obj\Debug\AspnetCompileMerge\TempBuildDir" -prefix PURV -copyattrs obj\Debug\AssemblyInfo\AssemblyInfo.dll -a
已成功合并“{项目路径}\obj\Debug\AspnetCompileMerge\TempBuildDir”。
C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe -v / -p "{项目路径}obj\Debug\AspnetCompileMerge\Source" -u -c "{项目路径}\obj\Debug\AspnetCompileMerge\TempBuildDir"
6. 把准备好的文件合并复制到obj\Debug\Package\PackageTmp
发布管道 AspnetCompileMerge 阶段
正在创建目录“obj\Debug\Package\PackageTmp”。
正在将所有文件都复制到以下临时位置以进行打包/发布:
obj\Debug\Package\PackageTmp。
正在将 obj\Debug\AspnetCompileMerge\TempBuildDir\PrecompiledApp.config 复制到 obj\Debug\Package\PackageTmp\PrecompiledApp.config。
正在将 obj\Debug\AspnetCompileMerge\TempBuildDir\bin\App_global.asax.compiled 复制到 obj\Debug\Package\PackageTmp\bin\App_global.asax.compiled。
正在将 obj\Debug\AspnetCompileMerge\TempBuildDir\bin\App_global.asax.dll 复制到 obj\Debug\Package\PackageTmp\bin\App_global.asax.dll。
....
7. 发布PackageTmp的文件到目标地址
正在发布文件夹 /...
正在发布文件夹 bin...正在发布文件夹 Scripts...
....
至此站点成功发布 file://{SharePath}
用于发布的目录结构图: