6

私は現在、VS2012 内の組み込みの公開機能を使用して、ASP.NET MVC サイトを Web サーバー上のファイル システム ディレクトリ共有に公開しています。[公開] ボタンをクリックしたときに 1 つの場所だけでなく、複数の場所に公開できる方法はありますか?

2 番目のプロファイルを作成する必要がなく、同じプロセスを 2 回実行する必要がありません。追加のタグを追加して pubxml ファイルを変更し、発行ルーチンがそれを取得するかどうかを確認しました。しかし残念ながら、リストの最後の構成を選択しているようです。

CI ソリューションを実装することが理想であることは承知していますが、当面は発行機能に縛られており、比較的簡単に進める必要があります。

どうもありがとう

4

2 に答える 2

4

複数のファイル共有の場所にソリューションを公開するという同じニーズがありました。数か月前に質問がありましたが、回答があればコミュニティに役立つと思いました。

VS パブリッシュ プロファイルは、簡単に拡張できるプレーンな MSBuild ファイルであるため、これが私が思いついたソリューションです。

ビルド プロセスからいくつかのコード フラグメントを抽出しましたが、これはもう少し複雑なので、少し変更しなくてもすべてが機能することを保証するものではありません。

発行プロファイルで、以下に示すようにカスタムDeploymentPaths項目を追加しました。1 つ以上の追加の場所を定義できることに注意してください。

<ItemGroup Label="Defines additional publish locations">
  <DeploymentPaths Include="\\SERVER1\ShareFolder\ProjectA\" />
  <DeploymentPaths Include="\\SERVER2\ShareFolder\ProjectA\" />
</ItemGroup>

次に、カスタム ターゲットCustomWebFileSystemPublishを追加して、 WebFileSystemPublishの後に実行します。このターゲットは、既存のファイルの削除と新しいファイルのコピーを実行する別の MSBuild ファイル publish.xml を呼び出します。

<!-- 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>
于 2013-10-06T16:27:16.213 に答える
1

ディレクトリを監視し、新しいファイルが追加されたときに複数の場所にコピーする小さなWindowsサービスを作成できます

MSDNでFileSystemWatcherを試してください

于 2013-01-11T11:35:37.420 に答える