VS2012发布到多个位置

6
我目前使用VS2012内置的“发布”功能,将ASP.NET MVC站点发布到Web服务器上的文件系统目录共享。当我点击“发布”按钮时,有没有办法让它发布到多个位置,而不仅仅是一个位置?
我不想创建第二个配置文件并执行相同的过程,我已经尝试修改pubxml文件,通过添加额外的“”标签来查看发布程序是否会选取它。但不幸的是,它似乎只会选择列表中的最后一个配置。
我知道理想情况下应该使用CI解决方案,但目前为止,我只能使用“发布”功能,并且需要保持相对简单。
非常感谢。
2个回答

4
我们有向多个文件共享位置发布解决方案的需求,虽然这个问题几个月前就已经被提出,但我认为一个答案可能会对社区有益。由于VS发布配置文件是纯MSBuild文件,可以很容易地扩展,这里是我想到的解决方案。 请注意,我从我们的构建过程中提取了一些代码片段,因为这个过程有点复杂,所以不能保证所有代码都能正常工作,可能需要进行一些修改。
在发布配置文件中,我添加了一个自定义的DeploymentPaths项,如下所示。请注意,您可以定义一个或多个附加位置。
<ItemGroup Label="Defines additional publish locations">
  <DeploymentPaths Include="\\SERVER1\ShareFolder\ProjectA\" />
  <DeploymentPaths Include="\\SERVER2\ShareFolder\ProjectA\" />
</ItemGroup>

我添加了一个名为CustomWebFileSystemPublish的自定义目标,以便在WebFileSystemPublish之后运行。这个目标调用另一个名为publish.xml的MSBuild文件,执行删除现有文件和复制新文件的操作。

<!-- Custom File System Publish to deploy to additional locations based on DeploymentPaths -->
<Target Name="CustomWebFileSystemPublish" AfterTargets="WebFileSystemPublish" Condition=" @(DeploymentPaths)!='' ">
  <CreateItem Include="$(MSBuildProjectDirectory)\$(_PackageTempDir)">
    <Output ItemName="AbsoluteSourcePathItem" TaskParameter="Include" />
  </CreateItem>
  <CreateProperty Value="%(AbsoluteSourcePathItem.Fullpath)">
    <Output PropertyName="AbsoluteSourcePath" TaskParameter="Value" />
  </CreateProperty>

  <Message Text="### CustomWebFileSystemPublish" Importance="high" />
  <Message Text="### DeploymentPaths: @(DeploymentPaths)" Importance="high" />

  <MSBuild Projects="$(MSBuildProjectFile)" Properties="AbsoluteSourcePath=$(AbsoluteSourcePath)" Targets="DoPublish" />
</Target>

<Target Name="DoPublish">
  <Message Text="### DoPublish $(AbsoluteOutputPath) | %(DeploymentPaths.Identity)" Importance="normal" />
  <!-- Adjust path to the publish.xml file depending on where you put it in your solution -->
  <MSBuild Projects="..\Deployment\publish.xml" Properties="OutputPath=$(AbsoluteSourcePath);DeployPath=%(DeploymentPaths.Identity)" />
</Target>

最后,这里是publish.xml MSBuild文件。
<!-- Publish.xml -->
<Project ToolsVersion="4.0" DefaultTargets="Default" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 <Target Name="Start">
  <PropertyGroup>
   <!-- Ensure DeployPath has the expected trailing slash -->
   <DeployPath Condition=" '$(DeployPath)' != '' and !HasTrailingSlash('$(DeployPath)') ">$(DeployPath)\</DeployPath>
  </PropertyGroup>
  <Message Text=" # Deploying from $(OutputPath) to $(DeployPath) " Importance="normal" />
 </Target>

 <Target Name="CleanDeployFolder" DependsOnTargets="Start"
      Condition=" $(DeployPath)!=''">
  <Message Text=" # Cleaning files in $(DeployPath)" Importance="normal" />

  <!-- Defines the files to clean -->
  <ItemGroup>
   <DeployCleanFiles Include="$(DeployPath)\**\*.*" />
  </ItemGroup>

  <!--Delete files in Deploy folder (folders not deleted by Delete Task)-->
  <Delete Files="@(DeployCleanFiles)" />

  <Message Text=" # Cleaning files in $(DeployPath) Completed" Importance="normal" />
 </Target>

 <Target Name="CopyToDeployFolder" DependsOnTargets="CleanDeployFolder"
      Condition=" $(DeployPath)!=''">
  <Message Text=" # Copying files to $(DeployPath)" Importance="normal" />

  <ItemGroup>
   <OutputFiles Include="$(OutputPath)\**\*.*" />
  </ItemGroup>

  <Copy SourceFiles="@(OutputFiles)" DestinationFolder="$(DeployPath)%(OutputFiles.RecursiveDir)" />

  <Message Text=" # Copying files to $(DeployPath) Completed" Importance="normal" />
 </Target>

 <Target Name="Default" DependsOnTargets="CopyToDeployFolder" 
      Condition=" $(OutputPath)!='' And $(DeployPath)!='' ">
  <Message Text=" # Deploying from $(OutputPath) to $(DeployPath) Completed" Importance="normal" />
 </Target>
</Project>

1
你可以创建一个小的Windows服务来监视目录,并在添加新文件时复制到多个位置。
试试MSDN上的FileSystemWatcher

谢谢你的建议,我确实有一些小问题需要解决,但我真的只是想在发布功能和解决方案内部保持一致。如果可能的话,希望能提供一个解决方案。不过还是谢谢你的好建议。 - Cragly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接