代码之家  ›  专栏  ›  技术社区  ›  Julien Lebosquain

VS2010 Web Deploy:如何删除绝对路径并自动执行setacl?

  •  15
  • Julien Lebosquain  · 技术社区  · 15 年前

    Visual Studio 2010中的集成Web部署非常好。它可以创建一个可以在目标IIS计算机上使用msdeploy部署的包。问题是,当安装了msdeploy时,此包将被重新分发到一个客户机,该客户机将使用来自IIS的“导入应用程序”自行安装它。

    创建的默认包始终在源清单文件中包含来自开发计算机“d:\dev\xxx\obj\debug\package\packagetmp”的完整路径。当然,它不会阻止安装,因为它是这样设计的,但是在导入对话框中它看起来很难看,对客户机没有意义。更糟糕的是,他会想知道这些路径是什么,看起来很混乱。

    通过自定义.csproj文件(通过添加包创建任务使用的msbuild属性),我设法向包添加了其他参数。然而,我花了大部分时间在2600行长的web.publishing.targets上,试图理解是什么参数影响了“开发路径”行为,但没有成功。我还尝试在部署后使用setacl自定义给定文件夹的安全性,但我只使用相对路径通过msbuild实现了这一点…不过,我能否解决第一个问题并不重要。

    我可以在创建后修改生成的存档文件,但如果所有内容都使用msbuild自动化,我更愿意这样做。有人知道怎么做吗?

    2 回复  |  直到 12 年前
        1
  •  27
  •   Julien Hoarau    15 年前

    显示的路径由属性确定 _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_完整路径 _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>
      
        2
  •  3
  •   trailmax    12 年前

    我知道这是一个老掉牙的问题,我接受了原来为我做的回答,但还有更好的办法: http://sedodream.com/2013/01/13/WebPackagingFixingTheLongPathIssue.aspx

    我把代码复制到这里,以防链接失效。所有的功劳都应该归功于作者赛义德。

    在你 Package.pubxml 你在里面添加的文件 <Property Group> 标签:

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

    之后 <地产集团 但在 <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 用于样品。