Làm cách nào để tạo một trình tạo thay đổi tệp.Sửa đổi tệp bằng trình tạo đường ray
Tôi đang cố gắng tạo nó để tìm mẫu trong tệp và thêm nội dung vào dòng bên dưới. máy phát điện giàn giáo
Làm cách nào để tạo một trình tạo thay đổi tệp.Sửa đổi tệp bằng trình tạo đường ray
Tôi đang cố gắng tạo nó để tìm mẫu trong tệp và thêm nội dung vào dòng bên dưới. máy phát điện giàn giáo
Rails' thực hiện điều này khi nó bổ sung thêm một tuyến đường để config/routes.rb
Nó làm điều này bằng cách gọi một phương pháp rất đơn giản:
def gsub_file(relative_destination, regexp, *args, &block)
path = destination_path(relative_destination)
content = File.read(path).gsub(regexp, *args, &block)
File.open(path, 'wb') { |file| file.write(content) }
end
gì nó làm là tham gia một đường dẫn/tập tin như là đối số đầu tiên, tiếp theo là mẫu regexp, đối số gsub và khối. Đây là phương thức được bảo vệ mà bạn sẽ phải tạo lại để sử dụng. Tôi không chắc chắn nếu destination_path
là một cái gì đó bạn sẽ có quyền truy cập vào, vì vậy bạn có thể sẽ muốn vượt qua trong con đường chính xác và bỏ qua bất kỳ chuyển đổi.
Để sử dụng gsub_file
, giả sử bạn muốn thêm thẻ vào mô hình người dùng của mình. Dưới đây là cách bạn sẽ thực hiện:
line = "class User < ActiveRecord::Base"
gsub_file 'app/models/user.rb', /(#{Regexp.escape(line)})/mi do |match|
"#{match}\n has_many :tags\n"
end
Bạn đang tìm dòng cụ thể trong tệp, mở lớp và thêm has_many
dòng bên dưới.
Hãy cẩn thận, vì đây là cách dễ dàng nhất để thêm nội dung, đó là lý do tại sao định tuyến là một trong những địa điểm duy nhất sử dụng nó. Ví dụ trên thường được xử lý với một kết hợp.
Tôi thích câu trả lời của Jaime. Nhưng, khi tôi bắt đầu sử dụng nó, tôi nhận ra rằng tôi cần phải thực hiện một số sửa đổi. Đây là mã mẫu tôi đang sử dụng:
private
def destination_path(path)
File.join(destination_root, path)
end
def sub_file(relative_file, search_text, replace_text)
path = destination_path(relative_file)
file_content = File.read(path)
unless file_content.include? replace_text
content = file_content.sub(/(#{Regexp.escape(search_text)})/mi, replace_text)
File.open(path, 'wb') { |file| file.write(content) }
end
end
Đầu tiên, gsub
sẽ thay thế TẤT CẢ trường hợp văn bản tìm kiếm; Tôi chỉ cần một cái. Vì vậy, tôi đã sử dụng sub
để thay thế.
Tiếp theo, tôi cần kiểm tra xem chuỗi thay thế đã có sẵn chưa. Nếu không, tôi sẽ được lặp lại chèn nếu máy phát điện đường ray của tôi đã chạy nhiều lần. Vì vậy, tôi đã bọc mã trong một khối unless
.
Cuối cùng, tôi đã thêm def destination_path()
cho bạn.
Bây giờ, bạn sẽ sử dụng nó như thế nào trong bộ tạo đường ray? Dưới đây là ví dụ về cách tôi đảm bảo rằng simplecov được cài đặt cho rspec và dưa chuột:
def configure_simplecov
code = "#Simple Coverage\nrequire 'simplecov'\nSimpleCov.start"
sub_file 'spec/spec_helper.rb', search = "ENV[\"RAILS_ENV\"] ||= 'test'", "#{search}\n\n#{code}\n"
sub_file 'features/support/env.rb', search = "require 'cucumber/rails'", "#{search}\n\n#{code}\n"
end
Có lẽ cách thanh lịch và DRY-er hơn để thực hiện việc này. Tôi thực sự thích cách bạn có thể thêm một khối văn bản ví dụ của Jamie. Hy vọng rằng ví dụ của tôi bổ sung thêm một chút chức năng và kiểm tra lỗi.