2010-06-02 38 views
15

Triển khai Web tích hợp trong Visual Studio 2010 khá đẹp. Nó có thể tạo ra một gói sẵn sàng để được triển khai bằng cách sử dụng MSDeploy trên một máy tính mục tiêu IIS. Vấn đề là, gói này sẽ được phân phối lại cho một khách hàng sẽ tự cài đặt nó bằng cách sử dụng "Import Application" từ IIS khi MSDeploy được cài đặt.Triển khai Web VS2010: cách xóa đường dẫn tuyệt đối và tự động hóa setAcl?

Gói mặc định được tạo luôn bao gồm đường dẫn đầy đủ từ máy phát triển, "D: \ Dev \ XXX \ obj \ Debug \ Package \ PackageTmp" trong tệp kê khai nguồn. Nó không ngăn cản việc cài đặt của khóa học vì nó được thiết kế theo cách này, nhưng nó trông xấu xí trong hộp thoại nhập khẩu và không có ý nghĩa với khách hàng. Tồi tệ hơn anh ta sẽ tự hỏi những con đường đó là gì và có vẻ khá khó hiểu.

Bằng cách tùy chỉnh tệp .csproj (bằng cách thêm thuộc tính MSBuild được tác vụ tạo gói sử dụng), tôi đã quản lý để thêm các tham số bổ sung vào gói. Tuy nhiên, tôi đã dành hầu hết các buổi chiều trong 2600 dòng Web.Publishing.targets dài cố gắng để hiểu những gì tham số ảnh hưởng đến hành vi "con đường phát triển", vô ích. Tôi cũng đã cố gắng sử dụng setAcl để tùy chỉnh bảo mật trên một thư mục nhất định sau khi triển khai, nhưng tôi chỉ quản lý để làm điều này với MSBuild bằng cách sử dụng một đường dẫn tương đối ... nó không quan trọng nếu tôi giải quyết vấn đề đầu tiên.

Tôi có thể sửa đổi tệp lưu trữ đã tạo sau khi tạo nhưng tôi muốn mọi thứ được tự động hóa bằng MSBuild. Có ai biết làm thế nào để làm điều đó?

Trả lời

27

Đường dẫn được hiển thị được xác định bởi thuộc tính _MSDeployDirPath_FullPath.

Khách sạn này là setted bởi chuỗi này tài sản:

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

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

Như bạn có thể thấy, bạn không thể có đường dẫn tương đối, vì _MSDeployDirPath_FullPath là đường dẫn đầy đủ của _MSDeployDirPath.

Nhưng bạn có thể đơn giản hóa đường dẫn được hiển thị bằng cách ghi đè thuộc tính_PackageTempDir bằng đường dẫn bạn muốn được hiển thị cho khách hàng của mình. (Con đường này sẽ được sử dụng như một thư mục tạm thời cho thế hệ gói)

Bạn có thể ghi đè lên bất động sản:

  • Trong dòng lệnh:

    msbuild.exe projectfile.csproj /t:Package /p:_PackageTempDir=C:\Package 
    
  • Hoặc trực tiếp trong hồ sơ dự án :

    <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> 
    
+0

Cảm ơn, tôi không nghĩ mình sẽ nhận được câu trả lời sau hai tuần ... và bởi một Lyonnais khác. Thế giới chắc chắn là nhỏ. –

+0

Vui mừng khi đã giúp một Lyonnais đồng nghiệp ^^ –

2

Tôi biết đây là một câu hỏi cũ và câu trả lời được chấp nhận đã làm công việc cho tôi ban đầu, nhưng có một cách tốt hơn: http://sedodream.com/2013/01/13/WebPackagingFixingTheLongPathIssue.aspx

Tôi sao chép mã ở đây, trong trường hợp liên kết chết. Tất cả tín dụng nên đến Sayed - tác giả.

Trong file Package.pubxml của bạn, bạn thêm bên <Property Group> tag:

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

Và sau <Property Group>, nhưng trong vòng <Project> thêm này:

<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> 

Dưới đây là một ý chính với đầy đủ Package.pubxml cho mẫu.

+1

Tôi đã thử giải pháp này và nó đã làm việc để rút ngắn các đường dẫn gói, nhưng nó can thiệp với các biến đổi web.config. Tôi đã phải hoàn nguyên các thay đổi để sửa các biến đổi. – Josh

+0

Điều đó thật thú vị, bởi vì tôi chưa bao giờ gặp vấn đề 'web.config' và sửa lỗi này. – trailmax

+1

Có vẻ như vấn đề của tôi liên quan đến việc tự động tham số hóa chuỗi kết nối web.config. Một cái gì đó về điều đó là mất tích. Tôi kết thúc với những thứ như Josh

Các vấn đề liên quan