1

iisでホストされているwcfアプリケーションがあり、webdeployを使用してパッケージ化しようとしています。Visual Studioツールではすべてがうまく機能しますが、ログフォルダーを作成してアクセス許可を設定する必要もあります。このために、WebプロジェクトにProjectName.wpp.targetファイルを作成しました。ファイルは次のようになります

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

<Target Name="CreateLogsDirectory" AfterTargets="AddIisSettingAndFileContentsToSourceManifest">   
    <!-- This must be declared inside of a target because the property 
    $(_MSDeployDirPath_FullPath) will not be defined at that time. -->
    <ItemGroup>
      <MsDeploySourceManifest Include="dirPath">
        <Path>$(_MSDeployDirPath_FullPath)\logs</Path>
        <enableRule>DoNotDeleteRule</enableRule>
      </MsDeploySourceManifest>
    </ItemGroup>
  </Target>

  <Target Name="DeclareCustomParameters" AfterTargets="AddIisAndContentDeclareParametersItems">
    <!-- This must be declared inside of a target because the property 
    $(_EscapeRegEx_MSDeployDirPath) will not be defined at that time. -->
    <ItemGroup>
      <MsDeployDeclareParameters Include="LogsDirectoryPath">
        <Kind>ProviderPath</Kind>
        <Scope>dirPath</Scope>
        <Match>^$(_EscapeRegEx_MSDeployDirPath)\\logs$</Match>
        <Value>$(_DestinationContentPath)/log</Value>
        <ExcludeFromSetParameter>True</ExcludeFromSetParameter>
      </MsDeployDeclareParameters>
    </ItemGroup>
  </Target>
</Project>

dirPathプロバイダーがsourcemanifestファイルに追加されていることがわかりますが、パッケージをデプロイすると、ソースファイルパスを作成しようとします。基本的に、LogsDirectoryPAthアイテムはパスを置き換えていません。誰かが私がする必要があることを指摘できますか?ありがとう !

4

1 に答える 1

5

追加のディレクトリがWebアプリケーション内にあることを考えると、別のプロバイダーを含める必要はなく、dirPathそうすることでさらに頭痛の種(追加のパラメーター宣言など)が発生するだけです。

これが私がこの種のことを手伝うために使ういくつかのヘルパーです。アプリケーション固有の値は、wpp.targetsファイルで宣言できます。

<!-- Items specific to your application (these should be in your wpp.targets) -->
<ItemGroup>
  <SkipDeleteFiles Include="logs" />

  <EmptyDirectoriesToDeploy Include="logs" />

  <AdditionalAcls Include="logs">
    <AclAccess>Write</AclAccess>
  </AdditionalAcls>
</ItemGroup>

wpp.targetsそして、次の規則ベースの定義は、あなたまたはあなたにインポートできる共通のターゲットファイルのいずれかに置くことができますwpp.targets

<!-- 
  Empty directories
-->

<PropertyGroup>
  <BeforeAddContentPathToSourceManifest>
    $(BeforeAddContentPathToSourceManifest);
    CreateEmptyDirectories;
  </BeforeAddContentPathToSourceManifest>
</PropertyGroup>

<Target Name="CreateEmptyDirectories">
  <MakeDir Directories="$(_MSDeployDirPath_FullPath)\%(EmptyDirectoriesToDeploy.Identity)" 
           Condition="'@(EmptyDirectoriesToDeploy)' != ''" />
</Target>

<!-- 
  Additional ACLs 
-->

<ItemDefinitionGroup>
  <AdditionalAcls>
    <AclAccess>Write</AclAccess>
    <ResourceType>Directory</ResourceType>
  </AdditionalAcls>
</ItemDefinitionGroup>

<PropertyGroup>
  <AfterAddIisSettingAndFileContentsToSourceManifest>
    $(AfterAddIisSettingAndFileContentsToSourceManifest);
    AddAdditionalAclsToSourceManifest;
  </AfterAddIisSettingAndFileContentsToSourceManifest>
  <AfterAddIisAndContentDeclareParametersItems>
    $(AfterAddIisAndContentDeclareParametersItems);
    AddAdditionalAclsDeclareParameterItems
  </AfterAddIisAndContentDeclareParametersItems>
</PropertyGroup>

<Target Name="AddAdditionalAclsToSourceManifest">
  <ItemGroup Condition="'@(AdditionalAcls)' != ''">
    <MsDeploySourceManifest Include="setAcl">
      <Path>$(_MSDeployDirPath_FullPath)\%(AdditionalAcls.Identity)</Path>
      <setAclResourceType Condition="'%(AdditionalAcls.ResourceType)' != ''">%(AdditionalAcls.ResourceType)</setAclResourceType>
      <setAclAccess>%(AdditionalAcls.AclAccess)</setAclAccess>
      <AdditionalProviderSettings>setAclResourceType;setAclAccess</AdditionalProviderSettings>
    </MsDeploySourceManifest>
  </ItemGroup>
</Target>

<Target Name="AddAdditionalAclsDeclareParameterItems">
  <ItemGroup Condition="'@(AdditionalAcls)' != ''">
    <MsDeployDeclareParameters Include="Add %(AdditionalAcls.AclAccess) permission to %(AdditionalAcls.Identity) Folder">
      <Kind>ProviderPath</Kind>
      <Scope>setAcl</Scope>
      <Match>^$(_EscapeRegEx_MSDeployDirPath)\\@(AdditionalAcls)$</Match>
      <Description>Add %(AdditionalAcls.AclAccess) permission to %(AdditionalAcls.Identity) Folder</Description>
      <DefaultValue>{$(_MsDeployParameterNameForContentPath)}/@(AdditionalAcls)</DefaultValue>
      <DestinationContentPath>$(_DestinationContentPath)/@(AdditionalAcls)</DestinationContentPath>
      <Tags>Hidden</Tags>
      <ExcludeFromSetParameter>True</ExcludeFromSetParameter>
      <Priority>$(VsSetAclPriority)</Priority>
    </MsDeployDeclareParameters>
  </ItemGroup>
</Target>

<!-- 
  Skip delete files and directories
-->

<PropertyGroup>
  <ImportPublishingParameterValuesDependsOn>
    $(ImportPublishingParameterValuesDependsOn);
    AddSkipDirectives;
  </ImportPublishingParameterValuesDependsOn>
</PropertyGroup>

<ItemGroup>
  <SkipDeleteItems Include="@(SkipDeleteFiles)" 
                   Condition="'@(SkipDeleteFiles)' != ''">
    <Provider>filePath</Provider>
  </SkipDeleteItems>

  <SkipDeleteItems Include="@(SkipDeleteDirectories)" 
                   Condition="'@(SkipDeleteDirectories)' != ''">
    <Provider>dirPath</Provider>
  </SkipDeleteItems>
</ItemGroup>

<!-- Uses MSBuild trickery to add an escaped version of the skip path to as 
     "EscapedPath" metadata -->
<Target Name="AddRegexEscapedPathMetadata" Outputs="%(SkipDeleteItems.EscapedPath)">
  <EscapeTextForRegularExpressions Text="%(SkipDeleteItems.Identity)">
    <Output TaskParameter="Result" 
            PropertyName="_Temp_EscapeRegEx_SkipDeleteItemPath" />
  </EscapeTextForRegularExpressions>

  <ItemGroup>
    <SkipDeleteItems Condition="'%(SkipDeleteItems.Identity)' == '%(Identity)'" >
      <EscapedPath>$(_Temp_EscapeRegEx_SkipDeleteItemPath)</EscapedPath>
    </SkipDeleteItems>
  </ItemGroup>

  <PropertyGroup>
    <!-- Clear value -->
    <_Temp_EscapeRegEx_SkipDeleteItemPath></_Temp_EscapeRegEx_SkipDeleteItemPath>
  </PropertyGroup>

</Target>

<Target Name="AddSkipDirectives" DependsOnTargets="AddRegexEscapedPathMetadata">

  <ItemGroup>
    <MsDeploySkipRules Include="%(SkipDeleteItems.Identity)">
      <SkipAction>Delete</SkipAction>
      <ObjectName>%(SkipDeleteItems.Provider)</ObjectName>
      <AbsolutePath>%(SkipDeleteItems.EscapedPath)</AbsolutePath>
    </MsDeploySkipRules>
  </ItemGroup>

</Target>

注意:パッケージ化プロセスを展開プロセスから分離するために余分な労力を費やす場合、技術的には、ではなく自分のSkipDeleteFiles中にいる必要があります。pubxmlwpp.targets

于 2012-10-14T22:17:36.970 に答える