Vscode-docker: Pertimbangan ulang dari Dockerfile.* asosiasi file

Dibuat pada 5 Jul 2020  ·  27Komentar  ·  Sumber: microsoft/vscode-docker

Saya memiliki file bernama dockerfile.go , yang dikenali sebagai Dockerfile karena #1908 .

Saya tahu keputusan ini ada benarnya #1907 , tapi saya pikir itu tidak masuk akal. Ketika Dockerfile dikenali sebagai Unknown , tidak akan terjadi apa-apa. Tetapi ketika file go dikenali sebagai Dockerfile , VSCode akan memformatnya sebagai Dockerfile . (Terutama ketika saya memilih Format on save , saya pikir itu banyak digunakan.). Seperti yang Anda lihat pada tangkapan layar di bawah ini.

Ketika itu terjadi, saya harus mengembalikan kode dan menambahkan asosiasi file *.go. Ini adalah tindakan yang lebih berat daripada hanya menambahkan asosiasi dockerfile.

Jadi, saya pikir perlu untuk menghapus asosiasi file Dockerfile.* .

Annotation 2020-07-05 114338

P2 blocked

Semua 27 komentar

Ada jauh lebih banyak (sekitar 50x) lebih banyak orang dengan file Docker yang sebenarnya bernama Dockerfile.*** , daripada file non-Docker yang bernama itu, jadi kami berencana untuk mempertahankan #1908. Anda dapat mengganti ini di proyek Anda dengan sesuatu seperti ini di settings.json:

    "files.associations": {
        "dockerfile.go": "go"
    }

Saya membaca edisi #1907 dan saya tahu ada banyak orang yang menggunakan Dockerfile.*** , tetapi dapat ditutupi dengan menambahkan Dockerfile.prod , Dockerfile.dev dan seterusnya. Anda dapat melayani kelompok besar dengan menambahkan Dockerfile.xxx sebanyak mungkin. Tapi bukan berarti Anda bisa merugikan kelompok kecil.

Selain itu, pola Dockerfile.* mengacaukan asosiasi file dari ekstensi lain dan menyebabkan konflik.

itu dapat ditutupi dengan menambahkan Dockerfile.prod , Dockerfile.dev dan seterusnya.

Saya melihat ratusan akhiran ekstensi yang berbeda pada pencarian di GitHub dan telemetri; tidak berkelanjutan untuk mencoba menambahkannya kasus per kasus.

Selain itu, pola Dockerfile.* mengacaukan asosiasi file dari ekstensi lain dan menyebabkan konflik.

Bisakah Anda menguraikan? Bagaimana pengaturan asosiasi bahasa memengaruhi ekstensi lain?

Bisakah Anda menguraikan? Bagaimana pengaturan asosiasi bahasa memengaruhi ekstensi lain?

Misalnya, saya menginstal go extension dan dockerfile.go dikenali sebagai go file , tetapi akan dikenali sebagai Dockerfile setelah menginstal docker extension .

Saya mengerti apa yang kamu maksud. Bisakah Anda mencoba asosiasi bahasa? Itu seharusnya membuat dockerfile.go diperlakukan sebagai file Go.

Saya mengerti apa yang kamu maksud. Bisakah Anda mencoba asosiasi bahasa? Itu seharusnya membuat dockerfile.go diperlakukan sebagai file Go.

Ini adalah solusi bagi saya, tetapi yang saya inginkan adalah menghapus asosiasi file Dockerfile.* , jika menurut Anda itu akan memengaruhi ekstensi lain juga.

Saya tahu itu akan menggolongkan Dockerfiles dalam beberapa kasus, seperti ini, namun, ini hanya terjadi sebagian kecil sesering underclassifying. Dari apa yang saya lihat di telemetri itu sekitar 2% bernama Dockerfile.* yang bukan Dockerfile, dibandingkan dengan sekitar 98% itu.

Karena keterbatasan VSCode, tidak ada solusi sempurna, tetapi menambahkan secara manual masing-masing dari ratusan varian yang saya lihat tidak realistis. Kami memutuskan bahwa karena solusinya (mengatur asosiasi bahasa) adalah sama untuk masing-masing, maka lebih baik melakukan apa yang benar untuk 98% daripada 2%.

Saya pikir ada elemen lain yang harus kita pertimbangkan kecuali jumlahnya.

Katakanlah saya membuat dockerfile.go , apa yang saya harapkan untuk file ini diperlakukan sebagai go file . Karena memiliki ekstensi .go , tidak ada alasan untuk memperlakukannya sebagai Dockerfile .

Tetapi ketika saya membuat dockerfile.prod , tidak apa-apa jika vscode tidak memformatnya sebagai Dockerfile , karena saya tahu Dockerfile.prod bukan nama resmi dari Dockerfile . Sementara itu, kita dapat mengedit Dockerfile tanpa highlight dengan mudah, tetapi sulit untuk menulis go file tanpa pembentukan otomatis.

Jika Anda benar-benar ingin menutupi situasi sebanyak mungkin, saya pikir lebih baik menambahkan First Line Pattern , karena dockerfile harus dimulai dengan instruksi FROM , kata dokumen.

Saya akan memeriksa properti firstLine ini, saya tidak mengetahuinya sampai sekarang.

Terima kasih, perl extension gunakan properti baris pertama (https://github.com/microsoft/vscode/blob/7a5bca9fafbbb23de289179be95e9c4832540c02/extensions/perl/package.json#L23).

Jika Anda benar-benar ingin menutupi situasi sebanyak mungkin, saya pikir lebih baik menambahkan First Line Pattern , karena dockerfile harus dimulai dengan instruksi FROM , kata dokumen.

Mengabaikan baris baru dan mempertimbangkan spasi putih, Dockerfiles harus dimulai dengan komentar (atau direktif parser), instruksi ARG , atau instruksi FROM .

Saya melakukan tes kecil dan menambahkan First Line Property pada package.json ekstensi buruh pelabuhan, itu berfungsi.

Annotation 2020-07-06 234920

Mengabaikan baris baru dan mempertimbangkan spasi putih, Dockerfile harus dimulai dengan komentar (atau direktif parser), instruksi ARG, atau instruksi FROM.

Namun sayangnya, First Line Property tidak dapat mencakup kasus yang dimulai dengan komentar.

Saya telah melakukan beberapa penyelidikan. Properti firstLine diperlakukan sebagai OR bersama filenamePatterns --jadi, jika file cocok dengan filenamePatterns OR firstLine , itu akan diperlakukan sebagai Dockerfile. Jika filenamePattern yang bertentangan cocok, ia akan menggunakannya sebagai ganti Dockerfile. Misalnya, "test.py" yang dimulai dengan FROM alpine akan diperlakukan sebagai file Python.

Dengan "firstLine": "\\s*([Ff][Rr][Oo][Mm].+|#.*|[Aa][Rr][Gg].+)" , spasi putih di depan ditoleransi, dan FROM ... , ARG ... , #comments , dan #parser=directives tampaknya semuanya cocok dengan benar.

Beberapa contoh yang diperlakukan dengan benar sebagai Dockerfiles, dengan asumsi asosiasi "Dockerfile.*" dihapus:

Dockerfile.test:

FROM alpine
# Because the first line matches
    from alpine
# Because the first line matches
# The language server does warn about lowercase
    #a leading comment with leading whitespace
FROM alpine
# Because the first line matches
    # a leading comment with different leading whitespace
FROM alpine
# Because the first line matches
#fake=parserdirective
FROM alpine
# Because the first line matches
ARG test
FROM alpine
# Because the first line matches
ARG #blah--the language server correctly flags this as an error
FROM alpine
# Because the first line matches

File Docker:

using namespace std;
// Because the file name matches "Dockerfile"

Beberapa contoh yang tidak diperlakukan dengan benar sebagai Dockerfiles:

Dockerfile.py:

print('hello world')
# Because the file name matches "*.py" from Python

Beberapa contoh yang tidak diperlakukan dengan benar sebagai Dockerfiles:

Dockerfile.test:

FROM alpine
# No match on the first line, because it is blank

Dockerfile.py:

FROM alpine
# Because the file name matches "*.py" from Python

@rcjsuen @simpleapples (juga @chrisdoherty4 sejak dia pertama kali membuka #1907)

Ada tiga kekurangan:

  • File "Dockerfile.*" yang tidak cocok dengan baris pertama saat dibuka, kemudian diubah agar sesuai, tidak mengambil bahasa baru hingga tab ditutup dan dibuka kembali. Misalnya, jika saya membuat file kosong bernama "Dockerfile.test", dan membukanya untuk menambahkan konten, itu tidak akan diperlakukan sebagai Dockerfile (yang juga berarti tidak ada intellisense untuk membantu Anda menyusunnya). Jika saya menambahkan "FROM alpine", simpan, tutup, dan buka kembali, sekarang dikenali.
  • Nama file "Dockerfile.*" yang dimulai dengan kosong tidak akan diperlakukan sebagai Dockerfile (contoh kedua hingga terakhir), kecuali jika mereka mengatur bahasa atau asosiasi file.
  • "Dockerfile.*" yang cocok dengan filenamePattern bahasa lain akan selalu diganti sebagai bahasa itu (contoh terakhir). Misalnya, "Dockerfile.py" akan diperlakukan sebagai file Python, meskipun itu adalah Dockerfile yang valid.

Apa yang kalian semua pikirkan? Saya sedikit lebih khawatir tentang kekurangan pertama--ini mungkin membenarkan menambahkan kembali beberapa nama Dockerfile.* yang paling umum. Yang kedua dan ketiga tampaknya cukup kecil bagi saya.

@bwateratmsft Bagaimana dengan kasus seperti Dockerfile.sh dengan shebang?

#!/bin/sh
docker build .

Sintaks komentar Shell sama dengan Docker dan Python dengan # . Bagaimana ini akan terselesaikan?

Apa yang kalian semua pikirkan? Saya sedikit lebih khawatir tentang kekurangan pertama--ini mungkin membenarkan menambahkan kembali beberapa nama Dockerfile.* yang paling umum. Yang kedua dan ketiga tampaknya cukup kecil bagi saya.

@bwateratmsft Terima kasih telah menyelidiki.

Untuk shorcoming pertama, Sepertinya tidak ada cara yang lebih baik untuk menyelesaikan masalah. Tetapi kita dapat menambahkan dockerfile.xxx yang sering digunakan ke filenamePattern untuk menutupi sebagian besar situasi. Pertandingan firstLine dapat dianggap sebagai rencana B.

Untuk file yang dimulai dengan #comment , saya pikir itu tidak boleh diperlakukan sebagai dockerfile. Itu akan mengenai terlalu banyak jenis file, seperti file skrip shell, seperti yang dikatakan @rcjsuen .

Tapi kita bisa menambahkan dockerfile.xxx yang sering digunakan ke filenamePattern untuk menutupi sebagian besar situasi.

Saya tidak berpikir itu layak untuk jangka panjang. Kami menemukan ratusan nilai di #1907, ekor yang sangat panjang--jadi menambahkan 10 teratas masih menyisakan ratusan orang.

Saya belum yakin bahwa Dockerfile.* adalah masalah besar. Saya benar-benar menyadari itu mengganggu kasus asli @simpleapples , tetapi solusi untuk skenario itu sama dengan solusi sebelumnya, hanya sebaliknya. Namun, jumlah orang dengan masalah baru ( Dockerfile.* bukan Dockerfile, tetapi dikenali) jauh lebih kecil dibandingkan dengan masalah lama ( Dockerfile.* adalah Dockerfile, tetapi tidak dikenali) . Selain itu, saya masih merasa bahwa dockerfile.go dan sejenisnya adalah antipattern.

Mengingat saya menaikkan tiket asli, saya pikir saya akan berkontribusi secara singkat (dan pada dasarnya echo @bwateratmsft ).

Tidak masuk akal untuk mengembalikan perubahan yang melengkapi sebagian besar kasus penggunaan karena 1 kasus tepi yang dapat dikurangi dengan penggantian nama, atau baris konfigurasi tambahan.

@simpleapples , Anda mungkin akan beralih dari proyek Anda saat ini yang menggunakan dockerfile.go dan tidak pernah mengalami masalah lagi.

Saya tahu sulit untuk menjadi sempurna, berdasarkan beberapa alasan: Dockerfile adalah jenis file khusus yang biasanya tidak memiliki ekstensi file tertentu, dan VSCode mengizinkan xxx.* pada filenameMatch .

Jadi, masuk akal jika Anda bersikeras pada perubahan yang tersisa di # 1908, saya dapat mengatur asosiasi file yang ditentukan pengguna untuk menghindari masalah.

@bwateratmsft Terima kasih telah mencoba masalah ini.

Saya akan membiarkan ini terbuka untuk saat ini dan terus memikirkannya. Mungkin ada beberapa kombinasi pola nama file, pola baris pertama, dan tipe MIME yang menghilangkan kebutuhan untuk berkompromi.

Kasus penggunaan lain, generator template. Saya punya file Dockerfile.ejs.t yang diambil oleh aturan Dockerfile.* daripada parser ejs.

Di json pengaturan saya, saya menambahkan:

{
    "files.associations": {
        "Dockerfile.ejs.t": "ejs"
    }
}

Tetapi masalahnya di sini adalah saya tidak dapat membagikan pengaturan ini dengan tim saya. 😕.

Di json pengaturan saya, saya menambahkan:

{
    "files.associations": {
        "Dockerfile.ejs.t": "ejs"
    }
}

Tetapi masalahnya di sini adalah saya tidak dapat membagikan pengaturan ini dengan tim saya. 😕.

@TigerC10 Anda tidak dapat memasukkannya ke dalam file .vscode/settings.json di proyek Anda?

Saya membuka https://github.com/microsoft/vscode/issues/105590 , saya pikir hal termudah adalah jika kita dapat menambahkan pengecualian tertentu (seperti Dockerfile.go ). Jumlah nama file unik yang _are_ Dockerfiles besar tetapi jumlah yang _tidak_ Dockerfiles tampak relatif kecil-- Dockerfile.go tampaknya mungkin yang paling umum. Jika kami dapat mengecualikannya, kami akan sedikit meningkatkan akurasi klasifikasi bahasa kami.

Masalah lainnya adalah bahwa setelah dockerfile.go salah diidentifikasi sebagai Dockerfile mengganti bahasa menggunakan perintah Change Language Mode membuat penyorotan sintaks benar-benar kacau.

Mengingat https://github.com/microsoft/vscode/issues/105590 hulu ditolak, saya akan menutup ini. Saya pikir strategi terbaik untuk yang paling banyak adalah menjaga hal-hal seperti sekarang, dengan Dockerfile.* dikenali sebagai Dockerfile. Jika kami terus mendapatkan umpan balik, kami dapat mempertimbangkan kembali.

@segevfiner Kedengarannya seperti masalah dengan Visual Studio Code itu sendiri. Apakah ada masalah terbuka tentang ini?

@rcjsuen Tidak dapat menemukan, tetapi siapa yang tahu apa kata kunci yang tepat untuk menemukan yang sudah ada

Apakah halaman ini membantu?
0 / 5 - 0 peringkat