16

VisualStudio2010に統合されたWeb展開は非常に優れています。ターゲットIISマシンでMSDeployを使用して展開できるパッケージを作成できます。問題は、このパッケージが、MSDeployのインストール時にIISからの「アプリケーションのインポート」を使用して自分でインストールするクライアントに再配布されることです。

作成されるデフォルトのパッケージには、常に開発マシンからのフルパス「D:\ Dev \ XXX \ obj \ Debug \ Package\PackageTmp」がソースマニフェストファイルに含まれています。もちろん、このように設計されているため、インストールを妨げることはありませんが、インポートダイアログでは見苦しく、クライアントにとっては意味がありません。さらに悪いことに、彼はそれらのパスが何であるか疑問に思うでしょう、そしてそれはかなり混乱しているように見えます。

.csprojファイルをカスタマイズすることで(パッケージ作成タスクで使用されるMSBuildプロパティを追加することで)、パッケージにパラメーターを追加することができました。しかし、私は午後のほとんどを2600行の長さのWeb.Publishing.targetsで過ごし、どのパラメーターが「開発パス」の動作に影響を与えたかを理解しようとしましたが、無駄でした。また、展開後にsetAclを使用して特定のフォルダーのセキュリティをカスタマイズしようとしましたが、MSBuildでこれを行うには、相対パスを使用する必要がありました...最初の問題を解決するかどうかは問題ではありません。

生成されたアーカイブは作成後に変更できますが、MSBuildを使用してすべてを自動化することをお勧めします。誰かがそれを行う方法を知っていますか?

4

2 に答える 2

30

表示されるパスは、プロパティによって決定されます_MSDeployDirPath_FullPath

このプロパティは、次の一連のプロパティによって設定されます。

  • <_MSDeployDirPath_FullPath>@(_MSDeployDirPath->'%(FullPath)')</_MSDeployDirPath_FullPath>
  • <_MSDeployDirPath Include="$(_PackageTempDir)" />
  • <_PackageTempDir>$(PackageTempRootDir)\PackageTmp</_PackageTempDir>
  • <PackageTempRootDir>$(IntermediateOutputPath)Package</PackageTempRootDir>

_MSDeployDirPath_FullPath <-- @(_MSDeployDirPath->'%(FullPath)') <-- _PackageTempDir <-- $(PackageTempRootDir)\PackageTmp

_MSDeployDirPath_FullPathご覧のとおり、はのフルパスであるため、相対パスを設定することはできません_MSDeployDirPath

ただし、顧客に表示するパスでプロパティをオーバーライドすることにより、表示されるパスを簡略化でき _PackageTempDirます。(このパスは、パッケージ生成の一時ディレクトリとして使用されます)

プロパティをオーバーライドできます:

  • コマンドラインで:

    msbuild.exe projectfile.csproj /t:Package /p:_PackageTempDir=C:\Package
    
  • またはプロジェクトファイルに直接:

    <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
    <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
    
    <!-- Must be after Microsoft.WebApplication.targets import -->
    <PropertyGroup>
      <_PackageTempDir>C:\Package</_PackageTempDir>
    </PropertyGroup>
    
于 2010-06-15T20:19:21.260 に答える
3

私はこれが古い質問であり、受け入れられた答えが元々私のために仕事をしたことを知っていますが、より良い方法があります:http ://sedodream.com/2013/01/13/WebPackagingFixingTheLongPathIssue.aspx

リンクが切れた場合に備えて、ここにコードをコピーします。すべてのクレジットはSayed-作者に行く必要があります。

Package.pubxmlファイルに内部<Property Group>タグを追加します。

    <PackagePath Condition=" '$(PackagePath)'=='' ">website</PackagePath>
    <EnableAddReplaceToUpdatePacakgePath Condition=" '$(EnableAddReplaceToUpdatePacakgePath)'=='' ">true</EnableAddReplaceToUpdatePacakgePath>
    <PackageDependsOn>
      $(PackageDependsOn);
      AddReplaceRuleForAppPath;
    </PackageDependsOn>

そして後<Property Group>、しかし内にこれを<Project>追加します:

  <Target Name="AddReplaceRuleForAppPath" Condition=" '$(EnableAddReplaceToUpdatePacakgePath)'=='true' ">
    <PropertyGroup>
      <_PkgPathFull>$([System.IO.Path]::GetFullPath($(WPPAllFilesInSingleFolder)))</_PkgPathFull>
    </PropertyGroup>

    <!-- escape the text into a regex -->
    <EscapeTextForRegularExpressions Text="$(_PkgPathFull)">
      <Output TaskParameter="Result" PropertyName="_PkgPathRegex" />
    </EscapeTextForRegularExpressions>

    <!-- add the replace rule to update the path -->
    <ItemGroup>
      <MsDeployReplaceRules Include="replaceFullPath">
        <Match>$(_PkgPathRegex)</Match>
        <Replace>$(PackagePath)</Replace>
      </MsDeployReplaceRules>
    </ItemGroup>
  </Target>

これがサンプルの完全なPackage.pubxmlの要点です。

于 2013-12-23T16:13:50.817 に答える