CSS rút gọn có nên được lưu trữ trong Git?


10

Tôi sử dụng Gulp để tạo CSS rút gọn từ mã SASS của mình cho dự án tôi đang thực hiện.

Tôi tự hỏi liệu nó có được coi là cách thực hành tốt nhất để tạo lại CSS được rút gọn này khi đẩy trực tiếp từ Git ...

hoặc là

Để lưu trữ các tệp CSS được rút gọn trong Git để chúng được tự động đẩy trực tiếp vào sản xuất mà không cần làm việc thêm trên phần của máy chủ?

Tôi đánh giá cao ý tưởng của mọi người về điều này. Cảm ơn!


Chỉ có một nơi rút gọn css / js / vv. nên được lưu trữ : /dev/null.
R .. GitHub DỪNG GIÚP ICE

(Đó là vì máy chủ web của bạn là hoàn toàn khả năng sử dụng phương tiện giao thông gzip.)
R .. GitHub DỪNG GIÚP ICE

Lưu trữ cả CSS nén và không nén có nghĩa là bạn hiện có hai phiên bản của cùng một thứ. Đó là phiên bản chính tắc? Thật dễ dàng để dự tính kịch bản trong đó một nhà phát triển cập nhật CSS đã nén và một nhà phát triển khác cập nhật CSS không nén. Hai tài sản của bạn đã chuyển hướng. Tất nhiên quá trình nên ngăn chặn điều này nhưng đó là một triển vọng thực tế, ví dụ như một nhà phát triển mới trong nhóm.
Qwerky

Câu trả lời:


13

"Nó phụ thuộc." Để theo dõi phát triển bình thường, không. Tuy nhiên, đối với việc triển khai đám mây và DevOps, điều này thường thuận tiện hoặc thậm chí là bắt buộc.

Hầu hết thời gian, @ptyx là chính xác . Thật vậy, "không" của anh ta có thể được nói rõ hơn một chút. Một cái gì đó như "Không. Không! OMG NO! "

Tại sao không lưu trữ tài sản nén hoặc nén trong hệ thống kiểm soát nguồn như Git?

  1. Chúng có thể được phục hồi gần như tầm thường bởi quá trình xây dựng của bạn một cách nhanh chóng từ mã nguồn. Lưu trữ tài sản nén về cơ bản là lưu trữ cùng một nội dung logic hai lần. Nó vi phạm nguyên tắc "không lặp lại chính mình" (còn gọi là DRY ).

  2. Một lý do ít triết lý hơn nhưng thực tế hơn là các tài sản được tối giản hóa / tối ưu hóa có khả năng nén rất kém khi được lưu trữ trong Git. Các hệ thống kiểm soát nguồn hoạt động bằng cách nhận ra các thay đổi ("deltas") giữa các phiên bản khác nhau của mỗi tệp được lưu trữ. Để làm điều đó, họ "khác biệt" tệp mới nhất với phiên bản trước đó và sử dụng các đồng bằng này để tránh lưu trữ một bản sao hoàn chỉnh của mọi phiên bản của tệp. Nhưng các phép biến đổi được thực hiện trong bước minify / tối ưu hóa thường loại bỏ các điểm tương đồng và điểm tham chiếu mà thuật toán diff / delta sử dụng. Ví dụ tầm thường nhất là loại bỏ ngắt dòng và khoảng trắng khác; tài sản kết quả thường chỉ là một dòng dài. Nhiều phần của quy trình xây dựng Web - các công cụ như Babel , UglifyJS , Browserify ,Ít hơnSass / SCSS - chuyển đổi mạnh mẽ các tài sản. Sản lượng của họ là nhiễu loạn; thay đổi đầu vào nhỏ có thể dẫn đến những thay đổi lớn trong đầu ra. Kết quả là, thuật toán diff sẽ thường tin rằng nó nhìn thấy gần như một tệp hoàn toàn khác nhau mỗi lần. Kết quả là kho của bạn sẽ phát triển nhanh hơn. Đĩa của bạn có thể đủ lớn và mạng của bạn đủ nhanh, đó không phải là vấn đề lớn, đặc biệt là nếu có một giá trị để lưu trữ tài sản được tối ưu hóa / tối ưu hóa hai lần - mặc dù dựa trên điểm 1, các bản sao bổ sung có thể chỉ là vô nghĩa 100% sưng lên.

Tuy nhiên, có một ngoại lệ lớn: triển khai DevOps / đám mây. Một số nhà cung cấp đám mây và nhóm DevOps sử dụng Git và tương tự không chỉ để theo dõi các bản cập nhật phát triển mà còn tích cực triển khai các ứng dụng và tài sản của họ để kiểm tra và sản xuất máy chủ. Trong vai trò này, khả năng của Git để xác định hiệu quả "tập tin nào đã thay đổi?" cũng quan trọng như khả năng chi tiết hơn của nó để xác định "điều gì đã thay đổi trong mỗi tệp?" Nếu Git phải thực hiện một bản sao tệp gần như đầy đủ cho các tài sản được tối thiểu hóa / tối ưu hóa, sẽ mất nhiều thời gian hơn một chút so với trước đây, nhưng không có vấn đề gì lớn vì nó vẫn hoạt động rất tốt giúp tránh một bản sao của "mọi tệp trong dự án" trên mỗi chu kỳ triển khai.

Nếu bạn đang sử dụng Git làm công cụ triển khai, việc lưu trữ các tài sản được tối ưu hóa / tối ưu hóa trong Git có thể chuyển từ "không!" để mong muốn. Thật vậy, nó có thể được yêu cầu, giả sử nếu bạn thiếu các cơ hội xây dựng / xử lý hậu kỳ mạnh mẽ trên các máy chủ / dịch vụ mà bạn triển khai. (Cách phân đoạn các tài sản phát triển và triển khai trong trường hợp đó là một loại giun riêng biệt. Cho đến nay, người ta biết rằng nó có thể được quản lý theo nhiều cách, bao gồm một kho lưu trữ thống nhất, nhiều nhánh, phân vùng hoặc thậm chí nhiều kho lưu trữ chồng chéo. )


1
Cảm ơn vì điều này! Nhiều đánh giá cao. Tôi đã đánh dấu đây là câu trả lời thay vì nó có vẻ giải thích tốt hơn nhiều.
Connor Gurney

1
git không chỉ lưu trữ deltas. SVN thì có, nhưng git sử dụng một cơ chế phức tạp hơn nhiều để lưu trữ tệp. Một số người nói với bạn rằng nó lưu trữ một bản sao đầy đủ của mỗi tệp, nhưng từ những gì tôi hiểu, điều này cũng không chính xác. Tôi sẽ không cố gắng hiểu những gì nó làm, vì bản thân tôi không hoàn toàn rõ ràng về nó.
jpmc26

Tôi nghĩ rằng bạn có thể đạt được sắc thái chỉ bằng cách thay đổi, "và chỉ lưu trữ các đồng bằng mới" thành một thứ gì đó dọc theo dòng "và sử dụng các đồng bằng này để tránh lưu trữ một bản sao hoàn chỉnh của mọi phiên bản của tệp." Điều đó sẽ làm cho quan điểm của bạn, thực sự chính xác và tránh đi sâu vào vấn đề làm thế nào nó được thực hiện cho bất kỳ hệ thống kiểm soát nguồn cụ thể nào.
jpmc26

Có thể DevOps chỉ sử dụng git hook để tự động kích hoạt thu nhỏ trên máy chủ được triển khai, tận dụng tốt nhất cả hai thế giới?
Butussy Butkus

@BriptButkus Phụ thuộc vào máy chủ được triển khai. Để phụ thuộc vào hook hook, bạn phải 1 / giả sử các bộ chuyển đổi, bộ khai thác và tối ưu hóa phù hợp có mặt trên mục tiêu hoặc 2 / tải chúng trước khi chạy hook hook. 1 / là xúc xắc. 2 / áp đặt chi phí tải / độ trễ cho mỗi lần triển khai. Nó cũng giới thiệu các chế độ thất bại mới có thể và yêu cầu gỡ lỗi các móc bài trong một môi trường xa xôi, mờ đục. Không lý tưởng. Vì vậy, móc không phải là một viên đạn bạc. Chuyển đổi trước / tối ưu hóa tài sản có thể không phù hợp, nhưng nó mạnh mẽ và thực dụng.
Jonathan Eunice

17

Không.

Kiểm soát nguồn chỉ nên chứa nguồn. Nếu nó được tạo từ nguồn, nó không thuộc về nơi đó - và nên được tạo bởi quá trình xây dựng của bạn.

Lý do cơ bản mà bạn không muốn kiểm soát nguồn tạo vật phẩm xây dựng trung gian là vì nếu bạn làm như vậy, sẽ rất khó tin vào những gì bạn đang chạy đến từ nguồn bạn vừa sửa đổi hoặc từ một sản phẩm trung gian mà bạn không thể xây dựng lại .


3
Hãy nghĩ về mã được tạo theo cách bạn nghĩ về mã thực thi.
candied_orange

3
Nguyên tắc này không phải lúc nào cũng đúng. Nếu bạn có các tệp được tạo bằng các công cụ nặng mà bạn không thể mong muốn người dùng có, thì có thể đặt các tệp được tạo vào git. Nhiều người thậm chí đã đặt configurecác kịch bản autoconf được tạo trong git vì lý do này.
R .. GitHub DỪNG GIÚP ICE

@R ..: Lý tưởng nhất là bạn duy trì một kho lưu trữ tạo tác riêng cho những thứ đó, nhưng thực tế hiếm khi lý tưởng.
Kevin

@R bạn có thể thỏa hiệp - nhưng chỉ có thế thôi. Và trong trường hợp thu nhỏ CSS, tôi không nghĩ các công cụ đủ điều kiện là 'nặng' hoặc 'chậm' hoặc 'bất tiện'. Ngoài ra, có các cơ chế tiêm phụ thuộc thay thế (maven, ivy ...) hoạt động tốt và không yêu cầu bạn đặt mã được tạo trong kiểm soát nguồn của mình.
ptyx

1
@BriptButkus Tôi không có nhiều kiến ​​thức chuyên môn về trường hợp sùng đạo. Những gì tôi đã thấy là git được sử dụng như một cơ chế vận chuyển / phát hành / triển khai (rất thuận tiện và linh hoạt), chứ không đơn thuần là kiểm soát nguồn. Trừ khi git 'nguồn' và git 'phân phối' là riêng biệt (repos riêng hoặc các nhánh riêng biệt), điều này có nghĩa là bạn phải thỏa hiệp với nguồn-> build-> chuỗi có thể phân phối được - ví dụ: bạn sẽ kết thúc việc sản xuất có mã nguồn và các chi nhánh phụ nằm xung quanh và phát triển với các sản phẩm nhị phân không sử dụng. Đó là một sự thỏa hiệp thực dụng, nhưng tôi thích tách biệt mối quan tâm khi tôi có thể.
ptyx
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.