2012-10-12 34 views
6

Tôi có một sự kiện dựng sẵn trên một dự án web giúp rút gọn và nối các tệp javascript bằng nút. Điều này tạo ra một thư mục được gọi là BuiltScripts trong thư mục scripts mà là một bản sao của thư mục script ngoại trừ các tập tin được rút gọn. Khi tôi đang triển khai, tôi muốn xuất bản thư mục scripts bao gồm thư mục BuiltScripts bên trong nó. Để đạt được điều này, tôi đã thêm thư mục BuiltScripts vào dự án. Đây không phải là giải pháp lý tưởng như:MSBuild: Triển khai các tệp không có trong dự án

  1. Tôi phải có thư mục BuiltScripts được kiểm tra để xây dựng vì tệp trong đó chỉ đọc khi giải pháp nằm dưới sự kiểm soát nguồn. Điều này tạo ra phức tạp khi kiểm tra trong khi tôi có rất nhiều tập tin kiểm tra ra.
  2. Khi tôi thêm tệp mới vào dự án, tôi phải đảm bảo rằng tôi nhớ thêm tệp đó vào thư mục BuiltScripts hoặc phiên bản được xây dựng của tệp sẽ không được triển khai.
  3. Việc xây dựng của tôi sẽ không thành công trên máy chủ xây dựng vì các tệp trong thư mục BuiltScripts cũng chỉ được đọc ở đó.
  4. Có hai bản sao của một tệp có cùng tên là một vấn đề khi tìm kiếm tệp và thực hiện tìm kiếm dựa trên văn bản.

Tôi muốn xây dựng máy chủ xây dựng và khai thác các tệp javascript dưới dạng bước dựng sẵn nhưng tôi không muốn thư mục BuiltScripts được thêm vào dự án. Tuy nhiên khi xây dựng các gói phần mềm máy chủ dự án ở cuối tôi muốn nó để sao chép thư mục BuiltScripts với đầu ra của quá trình xây dựng. Làm thế nào tôi có thể đạt được điều này?

+0

Bạn đang sử dụng gì để triển khai \ xuất bản - là mục tiêu tiêu chuẩn msbuild này hay bạn đã thực hiện một cái gì đó tùy chỉnh? –

+0

@AlexeyShcherbak MSBuild, TFS, không có gì tùy chỉnh –

+0

Tôi nghi ngờ Sayed Ibrahim Hashimi đã viết bài đăng này với câu trả lời sau câu hỏi của bạn :). http://sedodream.com/2012/10/09/VSWebPublishHowToIncludeFilesOutsideOfTheProjectToBePublished.aspx –

Trả lời

5

Thay vì sử dụng sự kiện dựng sẵn của thuộc tính dự án (mà tôi nghĩ là ý của bạn), hãy ghi đè lên mục tiêu BeforeBuild trong tệp .csproj/.vbproj.

<Project ...> 
    ... 
    <Target Name="BeforeBuild"> 
    <!-- Create the 'BuildScripts' directory. --> 
    <!-- The $(IntermediateOutputPath) reference the 'obj' folder, which I like to --> 
    <!-- use for these kinds of things. --> 
    <MakeDir Directories="$(IntermediateOutputPath)BuiltScripts"> 
     <Output PropertyName="BuildScriptsPath" TaskParameter="DirectoriesCreated" /> 
    </MakeDir> 
    <!-- Execute the javascript minifier. --> 
    <Exec Command="..." /> 
    <!-- Create an item group for the minified scripts so we manipulate the target path. --> 
    <CreateItem Include="$(BuildScriptsPath)\*.js"> 
     <Output ItemName="BuiltScripts" TaskParameter="Include" /> 
     <Output ItemName="FileWrites" TaskParameter="Include" /> 
    </CreateItem> 
    <!-- Add the minified scripts to the Content item group, --> 
    <!-- which the deployment MSBuild inspects for files to deploy. --> 
    <CreateItem Include="@(BuiltScripts)" 
     AdditionalMetadata="TargetPath=scripts\%(Filename)%(Extension)"> 
     <Output ItemName="ContentWithTargetPath" TaskParameter="Include" /> 
    </CreateItem> 
    </Target> 
    ... 
</Project> 

Bạn có thể phải chơi với hình dạng nhóm Mục nội dung là đầu ra của tác vụ CreateItem nếu các tệp không được triển khai vào đúng thư mục. Lưu ý rằng tôi đã sử dụng phép biến đổi mục để tạo đường dẫn đích scripts\YourScript.js.

Cũng lưu ý công việc đầu tiên của CreateItem sẽ đưa đầu ra vào một nhóm mục có tên 'FileWrites'. Tôi phát hiện ra rằng mục tiêu Clean kiểm tra nhóm item đó để biết những file cần xóa.

Đặt XML đó vào tệp dự án của bạn sau các yếu tố <Import> và bạn nên làm tốt. Không yêu cầu kiểm soát nguồn kiểm tra và thậm chí máy chủ xây dựng của bạn cũng sẽ hài lòng.

+0

Bạn có thêm một bước để xóa nội dung thư mục BuiltScripts trước đó không? –

+0

Tôi chạy mã mẫu của mình và có vẻ như mục tiêu IncrementalClean sẽ xóa các tệp tự động vì chúng được bao gồm trong nhóm mục FileWrites, điều này rất hữu ích khi bạn xóa tệp .js và bạn không muốn nó được triển khai nữa. – Matt

0

Bạn không thể sử dụng sự kiện sau xây dựng để chạy tập lệnh để thực hiện những gì bạn muốn? Tôi sử dụng một để di chuyển các tập tin đầu ra của tôi đến một vị trí hoàn toàn không liên quan đến dự án. Cho dù đồng bằng của nó hàng loạt, VBScript/JScript, hoặc PowerShell bạn có thể làm khá nhiều bất cứ điều gì bạn muốn.

0

Tôi đã có một yêu cầu tương tự, mặc dù nó chỉ liên quan đến việc thêm tệp hiện có vào gói triển khai thay vì tạo chúng như một phần của bản dựng. Tôi đã tìm thấy kỹ thuật trên this page hữu ích.

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