欧美成人午夜精品久久久,国产?V天堂一区二区三区,欧美精品va在线观看,亚洲一区二区三区免费在线观看,av无码精品一区二区久久,欧美性爱视频不卡一区三区,欧美乱人伦视频在线观看,国产一级牲交高潮

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

context-mode:基于目錄切換的項(xiàng)目上下文管理器

context-mode:基于目錄切換的項(xiàng)目上下文管理器 說(shuō)實(shí)話一開(kāi)始做這個(gè)工具的時(shí)候我并沒(méi)有打算把它當(dāng)個(gè)項(xiàng)目來(lái)做。當(dāng)時(shí)手頭同時(shí)維護(hù)著三個(gè)項(xiàng)目一個(gè)是內(nèi)部管理系統(tǒng)一個(gè)是給客戶(hù)端寫(xiě)的 SDK 示例庫(kù)還有一個(gè)是個(gè)人博客的改造。每個(gè)項(xiàng)目的目錄結(jié)構(gòu)、格式化規(guī)范、需要注入給 AI 編程助手的項(xiàng)目說(shuō)明甚至終端里的提示符風(fēng)格都不一樣。我每天的狀態(tài)就是切目錄 → 改環(huán)境變量 → 翻 README 確認(rèn)約定 → 復(fù)制一份項(xiàng)目說(shuō)明貼給 AI 助手 → 開(kāi)始干活。切到下一個(gè)項(xiàng)目重復(fù)一遍。中間只要漏一步輕則 linter 報(bào)錯(cuò)刷屏重則把測(cè)試環(huán)境的配置打到生產(chǎn)目錄里。后來(lái)我實(shí)在受不了了花了兩個(gè)晚上寫(xiě)了一個(gè)叫 context-mode 的小工具。它的核心思路很簡(jiǎn)單把項(xiàng)目上下文做成可切換、可繼承、可自動(dòng)加載的配置文件進(jìn)入目錄即生效。這篇文章我盡量把設(shè)計(jì)思路、實(shí)現(xiàn)細(xì)節(jié)、踩過(guò)的坑都寫(xiě)清楚希望能給同樣被上下文碎片化折磨的人一點(diǎn)參考。1. 先厘清問(wèn)題我們說(shuō)的上下文到底指什么動(dòng)手寫(xiě)代碼之前我花了很長(zhǎng)一段時(shí)間去定義上下文這個(gè)詞。因?yàn)槿绻B要解決問(wèn)題的邊界都不清楚工具很容易做成一個(gè)什么都做、什么都做不好的瑞士軍刀。1.1 被分散在五六個(gè)地方的隱性信息以我當(dāng)時(shí)的日常開(kāi)發(fā)為例一個(gè)項(xiàng)目的上下文其實(shí)散落在這些地方終端環(huán)境變量NODE_ENV、API_BASE_URL、DATABASE_URL每次換項(xiàng)目都得手動(dòng) export更麻煩的是這些變量有時(shí)還需要區(qū)分開(kāi)發(fā)、測(cè)試、預(yù)發(fā)布環(huán)境。項(xiàng)目約定文檔README 里寫(xiě)的代碼風(fēng)格、commit 規(guī)范、目錄職責(zé)說(shuō)明。平時(shí)用不上但每次有新人加入或者你休假回來(lái)再看自己的代碼時(shí)這些信息就變得特別重要。給 AI 助手注入的提示詞當(dāng)時(shí)我在嘗試用 AI 輔助寫(xiě)代碼但每次都得把項(xiàng)目的技術(shù)棧、目錄結(jié)構(gòu)、編碼規(guī)范貼進(jìn)對(duì)話里。對(duì)話一長(zhǎng)AI 就忘了前面的約束還得重新貼。編輯器/終端配置比如 Prettier 的 printWidth、eslint 的規(guī)則集。雖然項(xiàng)目里通常有配置文件但有些團(tuán)隊(duì)規(guī)范不屬于某個(gè)具體工具而是人的約定。運(yùn)行腳本與啟動(dòng)方式啟動(dòng)開(kāi)發(fā)服務(wù)器是npm run dev還是make serve測(cè)試命令是什么這些信息通常埋在 package.json 或 Makefile 里但查找成本不低。這些信息并不是不存在而是太分散了。分散帶來(lái)的問(wèn)題就是每次切換項(xiàng)目你都要重新人肉加載一遍。而人最擅長(zhǎng)的事情就是忘記加載。1.2 為什么簡(jiǎn)單的 dotenv 方案不夠用可能你會(huì)說(shuō)用 direnv 或者 dotenv 不就解決了嗎我在初期確實(shí)試過(guò)這兩條路但它們解決的是不同層面的問(wèn)題。direnv 解決的是環(huán)境變量隨目錄自動(dòng)加載的問(wèn)題它能在你cd進(jìn)目錄時(shí)自動(dòng)執(zhí)行.envrc里的腳本。這很強(qiáng)大但也意味著它把執(zhí)行任意 shell 代碼的權(quán)力交給你如果配置不當(dāng)很容易出現(xiàn)進(jìn)了目錄就莫名其妙多了幾十個(gè)環(huán)境變量的情況排查起來(lái)很痛苦。dotenv 解決的是把配置寫(xiě)進(jìn).env文件的問(wèn)題但它本身不會(huì)自動(dòng)化你必須依賴(lài)框架的支持或者自己在啟動(dòng)時(shí)手動(dòng)加載。而且.env文件通常承擔(dān)不了項(xiàng)目約定文檔和AI 提示詞這種文本型上下文的職責(zé)。我需要的是一個(gè)更完整的抽象context-mode 應(yīng)該管理進(jìn)入一個(gè)項(xiàng)目時(shí)我需要讓哪些東西處于正確狀態(tài)這一整件事環(huán)境變量只是其中一部分。1.3 我對(duì) context-mode 的定義經(jīng)過(guò)兩天的折騰和思考我把 context-mode 的定義收斂成一句話一個(gè)輕量的、基于目錄切換的上下文管理器。它允許你為每個(gè)項(xiàng)目或全局環(huán)境定義一組上下文配置包括環(huán)境變量、項(xiàng)目說(shuō)明文本、目錄別名、啟動(dòng)命令模板然后在進(jìn)入項(xiàng)目目錄時(shí)自動(dòng)加載并生效。這個(gè)定義有幾個(gè)關(guān)鍵點(diǎn)基于目錄切換觸發(fā)不是手動(dòng) source也不是啟動(dòng)時(shí)讀取而是通過(guò)監(jiān)聽(tīng)cd操作觸發(fā)加載。配置是聲明式的用 YAML而不是 Shell 腳本。這樣可讀性好也能在加載前做校驗(yàn)。不只管環(huán)境變量還包括文本型的上下文項(xiàng)目說(shuō)明、可復(fù)用的命令。這給后面接入 AI 助手留了接口。2. 核心設(shè)計(jì)配置結(jié)構(gòu)、優(yōu)先級(jí)與加載時(shí)機(jī)定義清楚問(wèn)題之后設(shè)計(jì)就變得順理成章了。但真正實(shí)現(xiàn)的時(shí)候還是有幾個(gè)設(shè)計(jì)決策花了比較多的時(shí)間這里逐一說(shuō)明。2.1 三層的配置結(jié)構(gòu)我把配置分成三層分別存儲(chǔ)在不同的位置層級(jí)存儲(chǔ)位置作用范圍典型用途全局層~/.context-mode/global.yaml所有項(xiàng)目通用環(huán)境變量如EDITOR、個(gè)人偏好用戶(hù)層~/.context-mode/users/用戶(hù)名.yaml當(dāng)前用戶(hù)的個(gè)人項(xiàng)目個(gè)人開(kāi)發(fā)機(jī)的專(zhuān)屬配置不入庫(kù)項(xiàng)目層項(xiàng)目根/.ctx/config.yaml當(dāng)前項(xiàng)目項(xiàng)目相關(guān)的環(huán)境變量、說(shuō)明、命令模板全局層和用戶(hù)層的區(qū)別在于如果一臺(tái)開(kāi)發(fā)機(jī)只有你在用這兩層其實(shí)可以合并。但如果存在多用戶(hù)共用開(kāi)發(fā)機(jī)或者你需要把個(gè)人配置和機(jī)器配置分開(kāi)管理的場(chǎng)景區(qū)分開(kāi)來(lái)會(huì)有幫助。我認(rèn)識(shí)的一些團(tuán)隊(duì)會(huì)把用戶(hù)層的配置模板放進(jìn) dotfiles 倉(cāng)庫(kù)管理項(xiàng)目層的配置則要求項(xiàng)目成員統(tǒng)一維護(hù)。2.2 配置文件的字段設(shè)計(jì)每個(gè)配置文件的核心結(jié)構(gòu)長(zhǎng)這樣version: 1 name: my-project env: NODE_ENV: development API_BASE_URL: http://localhost:3000/api LOG_LEVEL: debug texts: ai_context: | 這是一個(gè)基于 FastAPI React 的項(xiàng)目。 后端代碼在 app/ 目錄下前端在 frontend/ 目錄下。 提交信息請(qǐng)使用 conventional commits 規(guī)范。 不要修改 database/migrations/ 下已有的遷移文件。 commands: dev: npm run dev test: npm run test -- --watch lint: npm run lint:fix aliases: dc: docker-compose shell: prompt_prefix: my-projectenv 字段用于注入環(huán)境變量texts 字段用于存儲(chǔ)任意文本段落ai_context是我專(zhuān)門(mén)給 AI 助手用的commands 字段定義常用的項(xiàng)目命令aliases 定義終端別名shell.prompt_prefix 用來(lái)修改終端提示符讓你一眼知道自己當(dāng)前在哪個(gè)項(xiàng)目里。2.3 優(yōu)先級(jí)規(guī)則小范圍覆蓋大范圍三層配置之間的優(yōu)先級(jí)很明確項(xiàng)目層 用戶(hù)層 全局層這個(gè)規(guī)則的含義是項(xiàng)目層的同名環(huán)境變量會(huì)覆蓋用戶(hù)層和全局層的定義。這么設(shè)計(jì)的邏輯很簡(jiǎn)單——離項(xiàng)目越近的配置對(duì)項(xiàng)目的了解越準(zhǔn)確。全局層定義的API_BASE_URL是通用默認(rèn)值但項(xiàng)目 A 可能有自己的 API 地址這時(shí)候項(xiàng)目層的配置必須獲勝。在實(shí)際實(shí)現(xiàn)中我采用的是逐層合并的策略先讀全局層再讀用戶(hù)層最后讀項(xiàng)目層同名字段后讀的覆蓋先讀的。YAML 文件之間的嵌套結(jié)構(gòu)比如命令和別名也遵循同樣的規(guī)則但環(huán)境變量層面因?yàn)椴淮嬖谇短赘采w邏輯更簡(jiǎn)單直接。2.4 加載時(shí)機(jī)shell hook 的設(shè)計(jì)要讓進(jìn)入目錄自動(dòng)生效落地必須和 shell 集成。在 bash 和 zsh 中都有現(xiàn)成的chpwd鉤子機(jī)制可以在目錄切換后觸發(fā)自定義函數(shù)。但在實(shí)現(xiàn)細(xì)節(jié)上有一個(gè)很容易被忽略的問(wèn)題hook 里不能直接修改當(dāng)前 shell 的環(huán)境變量。如果你在 hook 里面寫(xiě)export FOObar其實(shí)是在子 shell 里執(zhí)行的對(duì)當(dāng)前 shell 完全不生效。所以正確的做法是hook 函數(shù)把需要導(dǎo)出的變量作為字符串輸出然后通過(guò)eval在當(dāng)前 shell 里執(zhí)行。我最終的方案是# 在 .bashrc 或 .zshrc 中 _context_mode_hook() { local output output$(context-mode apply --export 2/dev/null) if [ -n $output ]; then eval $output fi } # 定義 PROMPT_COMMAND 或者在 zsh 中用 add-zsh-hook if [ -n $ZSH_VERSION ]; then autoload -Uz add-zsh-hook add-zsh-hook chpwd _context_mode_hook else PROMPT_COMMAND_context_mode_hook; $PROMPT_COMMAND fi # 初始加載 _context_mode_hookcontext-mode apply --export命令會(huì)輸出類(lèi)似export NODE_ENVdevelopment; export API_BASE_URL...;的片段然后由 hook 里的eval真正執(zhí)行。3. 從零實(shí)現(xiàn)核心邏輯其實(shí)只有兩百行整個(gè)工具的核心邏輯并不復(fù)雜我把代碼量控制在一千行以?xún)?nèi)。這里只講幾個(gè)關(guān)鍵的實(shí)現(xiàn)點(diǎn)。3.1 目錄搜索向上查找 .ctx 目錄context-mode 的apply命令第一步是定位當(dāng)前目錄所屬的項(xiàng)目根。做法是從當(dāng)前目錄開(kāi)始逐級(jí)向上查找.ctx目錄找到的第一個(gè)就是項(xiàng)目配置。from pathlib import Path def find_project_root(start: Path) - Path | None: current start.resolve() while True: if (current / .ctx / config.yaml).exists(): return current if current.parent current: return None current current.parent這段代碼要注意兩個(gè)點(diǎn)先resolve()再開(kāi)始查找避免路徑里有..或符號(hào)鏈接導(dǎo)致查找路徑和實(shí)際路徑不一致。邊界條件current.parent current說(shuō)明已經(jīng)到根目錄必須終止循環(huán)否則會(huì)無(wú)限循環(huán)。如果找到項(xiàng)目根就加載項(xiàng)目層配置否則只加載全局層和用戶(hù)層配置。3.2 變量展開(kāi)支持嵌套引用環(huán)境變量之間有時(shí)會(huì)互相引用。比如你配置一個(gè)BASE_URL然后API_URL基于它拼接env: BASE_URL: http://localhost:8080 API_URL: ${BASE_URL}/api這里需要支持${VAR}的占位符展開(kāi)。實(shí)現(xiàn)上我用正則找出所有占位符然后遞歸查詢(xún)import re from typing import Dict ENV_RE re.compile(r\$\{([^}])\}) def expand_env_vars(value: str, env: Dict[str, str], stack: set) - str: def replacer(match): key match.group(1) if key in stack: raise ValueError(fcircular reference detected: {key}) if key not in env: return match.group(0) stack.add(key) expanded expand_env_vars(env[key], env, stack) stack.remove(key) return expanded return ENV_RE.sub(replacer, value)注意我用了一個(gè)stack集合來(lái)檢測(cè)循環(huán)引用。如果兩個(gè)變量互相引用簡(jiǎn)單的遞歸展開(kāi)會(huì)死循環(huán)這個(gè)檢測(cè)能在第一時(shí)間報(bào)錯(cuò)而不是等到棧溢出。3.3 輸出的幾種模式apply命令根據(jù)不同的使用場(chǎng)景輸出不同的格式。這是上下文切換工具能不能融入工作流的關(guān)鍵。# apply.py def generate_exports(merged: dict) - str: lines [] for key, value in merged[env].items(): escaped value.replace(, \\) lines.append(fexport {key}{escaped};) return \n.join(lines) def generate_json(merged: dict) - str: import json return json.dumps({ env: merged[env], texts: merged[texts], commands: merged[commands], }, ensure_asciiFalse, indent2)--export給 shell hook 用--json給其他程序比如 TextMate 插件、CI 腳本、AI 輔助工具用。后面我會(huì)講到這個(gè)--json輸出后來(lái)成了接入 AI 助手的關(guān)鍵接口。3.4 解釋為什么不用配置文件驅(qū)動(dòng) hook有人可能會(huì)問(wèn)既然要執(zhí)行 shell 層面的操作比如設(shè)置 aliases為什么不直接在.ctx/config.yaml里允許寫(xiě) shell 代碼然后 source 它我最初確實(shí)想過(guò)這種方案但很快否定了。原因有三安全性如果項(xiàng)目層的配置可以寫(xiě)任意 shell 代碼那么克隆一個(gè)惡意倉(cāng)庫(kù)進(jìn)到目錄就執(zhí)行了惡意腳本這是巨大的安全風(fēng)險(xiǎn)。聲明式配置沒(méi)有這個(gè)問(wèn)題最多是設(shè)置一些環(huán)境變量和別名??梢浦残許hell 腳本天然依賴(lài)當(dāng)前 shell 的類(lèi)型和機(jī)器環(huán)境聲明式配置可以跨 shell、跨平臺(tái)復(fù)用。可校驗(yàn)性YAML 結(jié)構(gòu)可以被解析和檢查shell 腳本則很難靜態(tài)分析。所以 context-mode 的設(shè)計(jì)原則是狀態(tài)變更全部通過(guò) export 和 alias 白名單實(shí)現(xiàn)不讓配置直接接觸 shell。4. 實(shí)測(cè)場(chǎng)景三種用法把上下文真正串起來(lái)工具寫(xiě)完之后我在自己的開(kāi)發(fā)環(huán)境里用了一周期間不斷調(diào)整。這里分享三個(gè)最典型的實(shí)測(cè)場(chǎng)景以及效果。4.1 場(chǎng)景一AI 編程助理的上下文注入這個(gè)場(chǎng)景應(yīng)該是最多人需要的。我用 AI 輔助寫(xiě)代碼時(shí)最大的痛點(diǎn)就是它不記得項(xiàng)目約定。每次開(kāi)新對(duì)話都要重新貼一遍項(xiàng)目說(shuō)明貼得不夠詳細(xì)時(shí)它就會(huì)給出不符合項(xiàng)目風(fēng)格的代碼。有了 context-mode 之后我寫(xiě)了一個(gè)小腳本ctx-ai#!/usr/bin/env bash # 將項(xiàng)目上下文輸出為適合粘貼給 AI 助手的文本 context-mode apply --json | plutil -convert raw -r -o - 2/dev/null || \ context-mode apply --json | python3 -c import json, sys ctx json.load(sys.stdin) for key, text in ctx[texts].items(): print(f {key} ) print(text) print() 然后在 AI 助手的 Custom Instructions 或者每次對(duì)話開(kāi)始時(shí)先粘貼ctx-ai的輸出。實(shí)測(cè)體驗(yàn)是AI 對(duì)項(xiàng)目結(jié)構(gòu)的理解、代碼風(fēng)格的遵循程度明顯提升因?yàn)樯舷挛恼f(shuō)明里寫(xiě)清楚了前端在什么目錄后端 API 使用什么框架不要修改哪個(gè)目錄下的文件這些關(guān)鍵約束。這個(gè)場(chǎng)景的核心價(jià)值不在于省了幾行字而是讓 AI 的回復(fù)質(zhì)量從一開(kāi)始就基于正確的上下文而不是靠它猜。后來(lái)我還做了一步自動(dòng)化的嘗試寫(xiě)了一個(gè)代理腳本把ctx-ai的輸出自動(dòng)拼接到發(fā)送給 AI API 的請(qǐng)求里。這個(gè)已經(jīng)脫離了 context-mode 本身的功能范圍但也驗(yàn)證了--json輸出作為接口的包容性。4.2 場(chǎng)景二多項(xiàng)目環(huán)境變量自動(dòng)切換第二個(gè)直接受益的場(chǎng)景是多項(xiàng)目并行開(kāi)發(fā)時(shí)的環(huán)境變量混亂問(wèn)題。之前的情況是項(xiàng)目 A 需要NODE_ENVstaging項(xiàng)目 B 需要NODE_ENVdevelopment項(xiàng)目 C 需要DATABASE_URL指向本地 Postgres。一旦你忘了切換就可能把 staging 的配置用在 development 的項(xiàng)目里。雖然不至于出大事故但排查起來(lái)很費(fèi)時(shí)間。配好 context-mode 后的流程變成了# 項(xiàng)目 A 的 .ctx/config.yaml env: NODE_ENV: staging API_BASE_URL: https://staging.example.com DATABASE_URL: postgres://localhost:5432/project_a_staging # 項(xiàng)目 B 的 .ctx/config.yaml env: NODE_ENV: development API_BASE_URL: http://localhost:3000 DATABASE_URL: postgres://localhost:5432/project_b_dev切換目錄的瞬間環(huán)境變量就自動(dòng)變成對(duì)應(yīng)項(xiàng)目的值再也不用手動(dòng) export。我還特意在shell.prompt_prefix里配置了項(xiàng)目縮寫(xiě)終端提示符會(huì)顯示[proj-a] ? src/這樣的格式低頭看一眼就知道自己在哪。這里額外分享一個(gè)細(xì)節(jié)環(huán)境變量寫(xiě)進(jìn)配置文件之后項(xiàng)目之間的隔離性會(huì)變強(qiáng)但也要注意同一個(gè)變量在不同項(xiàng)目里的值是否有潛在沖突。比如兩個(gè)項(xiàng)目都定義了PORT如果你在 global 層也定義了PORT8080最后生效的是項(xiàng)目層的值。相反如果某個(gè)項(xiàng)目沒(méi)定義PORTglobal 層的8080就會(huì)泄漏進(jìn)去。所以我的建議是global 層只放真正通用的變量比如EDITOR、LANG不要放可能因項(xiàng)目而異的變量。4.3 場(chǎng)景三新成員上手與團(tuán)隊(duì)約定沉淀第三個(gè)場(chǎng)景屬于長(zhǎng)期價(jià)值向的。對(duì)于團(tuán)隊(duì)項(xiàng)目context-mode的項(xiàng)目配置文件可以作為機(jī)器可讀的 README存在。新成員克隆倉(cāng)庫(kù)后只要安裝 context-mode 并進(jìn)到項(xiàng)目目錄環(huán)境變量、啟動(dòng)命令說(shuō)明都會(huì)自動(dòng)就位。為了這個(gè)場(chǎng)景我后來(lái)又給配置文件增加了一個(gè)字段docs: overview: | 本項(xiàng)目用于處理用戶(hù)訂單的生命周期管理。 包含訂單創(chuàng)建、支付回調(diào)、庫(kù)存扣減、售后流程。 技術(shù)棧Spring Boot 3 MySQL 8 Redis。 onboarding: | 1. 本地啟動(dòng)依賴(lài)docker-compose up -d mysql redis 2. 復(fù)制 application.dev.yaml 并修改數(shù)據(jù)庫(kù)密碼 3. 訪問(wèn) http://localhost:8080/actuator/health 確認(rèn)服務(wù)啟動(dòng)新成員可以用context-mode doc onboarding快速看到上手指引也可以直接用context-mode text ai_context輸出給 AI 助手。這實(shí)際上把項(xiàng)目經(jīng)驗(yàn)從一個(gè)不可查詢(xún)的 Word 文檔變成了結(jié)構(gòu)化的、可以自動(dòng)加載的資產(chǎn)。5. 踩坑記錄這些問(wèn)題沒(méi)試過(guò)真的想不到我前面說(shuō)核心邏輯只有兩百行但真正把它接入日常開(kāi)發(fā)流程時(shí)是花了一半以上的時(shí)間在解決各種邊緣問(wèn)題。這些坑不一定都能通過(guò)代碼邏輯規(guī)避但提前知道可以讓后來(lái)者少走彎路。5.1 shell hook 的環(huán)境變量導(dǎo)出時(shí)機(jī)最典型的坑就是我之前提到的子 shell 問(wèn)題。第一次把_context_mode_hook的函數(shù)寫(xiě)好后我在代碼里直接調(diào)用os.environ[FOO] bar然后發(fā)現(xiàn)當(dāng)前 shell 一點(diǎn)反應(yīng)都沒(méi)有。排查了半天才意識(shí)到context-mode是一個(gè)獨(dú)立進(jìn)程它只能修改自己的進(jìn)程環(huán)境變量不能影響父進(jìn)程 shell。這個(gè)問(wèn)題的教訓(xùn)是任何外部工具都沒(méi)法直接改變 shell 的環(huán)境只能通過(guò)輸出文本 父 shell eval的組合拳來(lái)實(shí)現(xiàn)。我后來(lái)在 README 里專(zhuān)門(mén)用粗體強(qiáng)調(diào)了這一點(diǎn)context-mode 本身不修改環(huán)境變量它只輸出你需要執(zhí)行的 export 語(yǔ)句。5.2 eval 的安全與轉(zhuǎn)義問(wèn)題既然用了eval轉(zhuǎn)義問(wèn)題就繞不開(kāi)。如果環(huán)境變量的值里帶有單引號(hào)直接拼進(jìn)export FOO...就會(huì)出錯(cuò)。我在前面代碼里用了value.replace(, \\)這個(gè)技巧簡(jiǎn)單解釋一下假設(shè)值里有單引號(hào)Its a test。直接拼export FOOIts a test是錯(cuò)誤的因?yàn)?shell 會(huì)把字符串切成It和s a test。正確的做法是用\來(lái)表示一個(gè)轉(zhuǎn)義的單引號(hào)。替換后的結(jié)果是export FOOIt\s a test;。這個(gè)寫(xiě)法雖然看起來(lái)很丑但確實(shí)是 shell 中安全的單引號(hào)轉(zhuǎn)義方案。后來(lái)我還遇到了值里包含$的坑。比如某個(gè)密碼是pa$$word如果用雙引號(hào)包會(huì)觸發(fā)變量展開(kāi)必須用單引號(hào)包。這也是我堅(jiān)持在generate_exports里用單引號(hào)包裹所有值的原因。5.3 符號(hào)鏈接目錄的根查找find_project_root里我特意用了resolve()這源于一次實(shí)際遇到的問(wèn)題。我的項(xiàng)目目錄是一個(gè)符號(hào)鏈接指向掛在別的盤(pán)符下的真實(shí)目錄。第一次實(shí)現(xiàn)時(shí)我沒(méi)有 resolve導(dǎo)致符號(hào)鏈接路徑下解析出的項(xiàng)目配置路徑和實(shí)際路徑不一致出現(xiàn)了能找到配置文件但加載失敗的詭異情況。resolve()會(huì)把符號(hào)鏈接解析成真實(shí)路徑這樣目錄查找和配置文件讀取都在同一套路徑體系下進(jìn)行問(wèn)題就消失了。副作用是如果同一個(gè)真實(shí)目錄有兩個(gè)符號(hào)鏈接指向它用不同鏈接進(jìn)入時(shí)context-mode 感知到的項(xiàng)目根是同一個(gè)真實(shí)目錄這是預(yù)期行為因?yàn)榕渲梦募旧砭驮谡鎸?shí)目錄下。5.4 hook 重入保護(hù)還有一個(gè)必須處理的細(xì)節(jié)hook 自身的觸發(fā)時(shí)機(jī)。_context_mode_hook被定義在PROMPT_COMMAND里這意味著每次終端顯示提示符之前都會(huì)調(diào)用一次。當(dāng)context-mode apply --export輸出的內(nèi)容很多時(shí)可能會(huì)導(dǎo)致終端每次都執(zhí)行一長(zhǎng)串 export體驗(yàn)很差。更嚴(yán)重的問(wèn)題是潛在的死循環(huán)如果在配置的環(huán)境變量里包含了一個(gè)會(huì)觸發(fā) hook 的操作不太可能但理論上存在或者 eval 的執(zhí)行本身又改變了目錄就可能觸發(fā)遞歸調(diào)用。解決方案是加一個(gè)簡(jiǎn)單的重入保護(hù)_CONTEXT_MODE_LAST_DIR _context_mode_hook() { local current_dir$PWD if [ $current_dir $_CONTEXT_MODE_LAST_DIR ]; then return 0 fi _CONTEXT_MODE_LAST_DIR$current_dir # ... 實(shí)際邏輯 }這個(gè)值記錄了上次應(yīng)用的目錄只有目錄變化時(shí)才重新執(zhí)行 apply。這既避免了重復(fù) export也在很大程度上防止了重入。5.5 變量展開(kāi)的循環(huán)引用檢測(cè)前面提到過(guò)expand_env_vars函數(shù)的stack參數(shù)這是實(shí)際踩坑后才加的。一開(kāi)始我的實(shí)現(xiàn)很簡(jiǎn)單直接遞歸展開(kāi)def expand_env_vars(value, env): return ENV_RE.sub(lambda m: env.get(m.group(1), m.group(0)), value)直到某天我在配置文件里誤寫(xiě)了一個(gè)自引用env: FOO: ${FOO}-suffix然后apply命令就棧溢出崩潰了。排查過(guò)程倒是很直觀但加一個(gè)循環(huán)引用檢測(cè)也讓工具在面對(duì)更復(fù)雜的錯(cuò)誤配置時(shí)更加健壯。5.6 YAML 解析中的類(lèi)型陷阱YAML 解析有個(gè)經(jīng)典坑NODE_ENV: true如果寫(xiě)成NODE_ENV: true解析出來(lái)的就是一個(gè)布爾值而不是字符串。這會(huì)導(dǎo)致環(huán)境變量變成export NODE_ENVtrue看起來(lái)沒(méi)區(qū)別但某些框架做字符串比較時(shí)可能出問(wèn)題。為了避免這種隱式類(lèi)型轉(zhuǎn)換我在解析后的校驗(yàn)階段做了一步強(qiáng)制類(lèi)型轉(zhuǎn)換所有 env 字段的值都必須解析為字符串如果不是字符串就顯式轉(zhuǎn)換成字符串并給出一個(gè)警告。雖然這只是一個(gè)小小的防御措施但避免了大量由類(lèi)型歧義導(dǎo)致的詭異 bug。5.7 與 direnv 共存的沖突處理在我用上 context-mode 之前部分項(xiàng)目已經(jīng)在用 direnv。兩者同時(shí)存在時(shí)優(yōu)先級(jí)可能會(huì)打架。我的選擇是context-mode 只負(fù)責(zé)管理環(huán)境變量direnv 負(fù)責(zé)執(zhí)行復(fù)雜的 shell 級(jí)操作。規(guī)則是如果項(xiàng)目根目錄存在.ctx/config.yamlcontext-mode 的配置優(yōu)先生效direnv的.envrc可以往后放。實(shí)現(xiàn)方式是在apply函數(shù)里顯式檢查.envrc的存在并在輸出中優(yōu)先生成 context-mode 的 export。這種做法不一定適合所有人但至少在我的環(huán)境里它提供了一個(gè)清晰的遷移路徑。6. 進(jìn)階優(yōu)化讓 context-mode 更貼合日常使用基礎(chǔ)功能完成之后我又加了幾個(gè)提升體驗(yàn)的小功能這里挑兩個(gè)最有用的展開(kāi)講。6.1 動(dòng)態(tài)變量與系統(tǒng)信息有些場(chǎng)景下環(huán)境變量的值需要依賴(lài)當(dāng)前系統(tǒng)狀態(tài)。比如開(kāi)發(fā)時(shí)你需要把本機(jī)的局域網(wǎng) IP 注入到環(huán)境變量或者根據(jù)當(dāng)前 git 分支動(dòng)態(tài)切換環(huán)境。我在配置里支持了${ctx:git_branch}和${ctx:hostname}這類(lèi)動(dòng)態(tài)變量env: GIT_BRANCH: ${ctx:git_branch} HOST_IP: ${ctx:lan_ip}這些變量在處理時(shí)就近展開(kāi)def resolve_dynamic(key: str) - str: if key ctx:git_branch: import subprocess return subprocess.check_output( [git, rev-parse, --abbrev-ref, HEAD], stderrsubprocess.DEVNULL ).decode().strip() if key ctx:hostname: import socket return socket.gethostname() if key ctx:lan_ip: # 簡(jiǎn)化實(shí)現(xiàn)從 socket 推斷 import socket s socket.socket(socket.AF_INET, socket.SOCK_DGRAM) try: s.connect((8.8.8.8, 80)) return s.getsockname()[0] finally: s.close() return f${{{key}}}這里特別注意ctx:git_branch的執(zhí)行依賴(lài)當(dāng)前目錄在 git 倉(cāng)庫(kù)內(nèi)如果不在倉(cāng)庫(kù)內(nèi)會(huì)拋異常所以要捕獲異常并返回空字符串。這種功能看起來(lái)華而不實(shí)但在多分支并行開(kāi)發(fā)的工作流里非常實(shí)用比如你切到release分支時(shí)環(huán)境變量能自動(dòng)變成生產(chǎn)配置。6.2 按場(chǎng)景加載子組還有一個(gè)常用場(chǎng)景同一個(gè)項(xiàng)目開(kāi)發(fā)環(huán)境和測(cè)試環(huán)境需要不同的環(huán)境變量。雖然可以直接在項(xiàng)目層的 env 里寫(xiě)死但更優(yōu)雅的方式是支持場(chǎng)景子組scenes: dev: env: API_BASE_URL: http://localhost:3000 DEBUG: true test: env: API_BASE_URL: https://test.example.com DEBUG: false active_scene: dev使用context-mode apply --scene test可以臨時(shí)切換到 test 場(chǎng)景默認(rèn)使用active_scene里指定的場(chǎng)景。這個(gè)設(shè)計(jì)在測(cè)試 API 集成時(shí)特別有用避免為了切換場(chǎng)景而反復(fù)編輯配置文件。6.3 與編輯器/IDE 的協(xié)作我使用 context-mode 的方式不止在終端里還通過(guò)輸出 JSON 喂給編輯器腳本。舉個(gè)例子在我的 Neovim 配置里有一個(gè) Lua 腳本會(huì)在加載項(xiàng)目文件時(shí)讀取context-mode apply --json的輸出動(dòng)態(tài)設(shè)置 pylsp 的路徑參數(shù)和 flake8 的 max-line-length。這樣同一份配置同時(shí)服務(wù)于終端和編輯器真正做到一處配置、處處生效。類(lèi)似地VS Code 用戶(hù)可以在.vscode/settings.json里引用環(huán)境變量{ python.analysis.extraPaths: [ ${env:PROJECT_SRC_PATH} ] }前提是 VS Code 的終端里環(huán)境變量已經(jīng)被 context-mode 注入過(guò)了。如果是從 GUI 啟動(dòng)的 VS Code那么需要通過(guò) shell 啟動(dòng) VS Code或者在.vscode/settings.json里改用context-mode apply --json的輸出。7. 最后再聊幾點(diǎn)維護(hù)心得工具用了大概半個(gè)月之后我停下來(lái)回看整個(gè)從零搭建的過(guò)程有幾個(gè)認(rèn)知層面的收獲值得記錄。第一工具的價(jià)值在于減少切換成本而不是減少配置成本。一開(kāi)始我花了很大精力去美化配置文件結(jié)構(gòu)、簡(jiǎn)化 YAML 語(yǔ)法后來(lái)發(fā)現(xiàn)在實(shí)際使用中配置一次的成本并不高真正高的是每次切換項(xiàng)目時(shí)重新加載腦內(nèi)上下文的成本。所以 context-mode 的核心必須放在加載要快、要準(zhǔn)、要自動(dòng)而不是一味追求配置的多功能性。第二聲明式配置的邊界就是工具的邊界。當(dāng)用戶(hù)想在配置文件里寫(xiě) shell 腳本來(lái)實(shí)現(xiàn)進(jìn)入目錄就做一堆事情時(shí)最好停下來(lái)想一想這事應(yīng)該由更通用的工具比如 Makefile、腳本來(lái)負(fù)責(zé)塞進(jìn) context-mode 只會(huì)增加維護(hù)復(fù)雜度。我現(xiàn)在的原則是環(huán)境變量、文本說(shuō)明、別名這些狀態(tài)交給 context-mode操作邏輯、流程控制這些行為交給項(xiàng)目自己的自動(dòng)化腳本。第三安全邊界一定要硬。既然 context-mode 可以注入環(huán)境變量那就意味著它有能力影響項(xiàng)目進(jìn)程的行為。如果項(xiàng)目層配置能被不懷好意的人改動(dòng)那就可能注入惡意變量。所以我現(xiàn)在只從可信來(lái)源克隆倉(cāng)庫(kù)同時(shí)會(huì)在apply之前校驗(yàn)配置文件哈希項(xiàng)目維護(hù)者可以把預(yù)期哈希寫(xiě)在.ctx/checksum文件中。這個(gè)機(jī)制雖然增加了一些流程負(fù)擔(dān)但對(duì)于團(tuán)隊(duì)協(xié)作場(chǎng)景我認(rèn)為是必要的。最后再分享一個(gè)小技巧如果你也和我一樣經(jīng)常用 AI 輔助編程建議在texts.ai_context里不僅寫(xiě)項(xiàng)目技術(shù)棧還要寫(xiě)清楚這個(gè)項(xiàng)目不做什么。比如本項(xiàng)目不做用戶(hù)注冊(cè)模塊統(tǒng)一走 SSO不要在 service 層直接操作數(shù)據(jù)庫(kù)請(qǐng)走 repository 層。這些負(fù)面約束往往比正面約束更能提升 AI 輸出的準(zhǔn)確性。我實(shí)測(cè)下來(lái)加了這些約束之后AI 生成的代碼方向明顯更符合團(tuán)隊(duì)的實(shí)際預(yù)期。context-mode 這個(gè)項(xiàng)目目前還在持續(xù)迭代不過(guò)它的核心價(jià)值已經(jīng)被驗(yàn)證了當(dāng)你把所有隱性上下文都顯式化、自動(dòng)化之后無(wú)論是在終端命令、IDE 配置還是 AI 協(xié)作場(chǎng)景整個(gè)開(kāi)發(fā)體驗(yàn)都會(huì)順暢很多。有類(lèi)似困擾的朋友不妨試試類(lèi)似的思路不一定要用我這個(gè)工具但把項(xiàng)目上下文管理起來(lái)這件事絕對(duì)值得投入時(shí)間。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
99精品视频在线6| 亚洲综合色婷婷| 69精品人妻不卡视频| 99色精品| 国产精品久久久60086| 变态另类色图| 99精品成人无码A片观看金桔| 色五月激情基地| 色婷亚洲| 亚洲AV无码电影| 日本狠狠干| 99开心五月五月丁香激情| 国产伊人五月天| av高清无码| 五月婷婷六月丁香| 六月婷婷亚洲| 丁香月五月天婷婷久久| 丁香六月婷婷综合色| 99情色五月天| 91中文狠狠综合| 99九无网码| 天天狠狠色噜噜| 天天日夜夜欢| 青青草原伊人网| 99久久久久| 天天狠狠夜夜狠狠2023| 99在这里有精品| 五月丁香福利| 丁香五月婷婷久久久| 五月丁香六月色| 久久99热免费最新版| 色久在| 久久久久99精品成人网站| 国产欧美日韩综合精品一区二区| 亚洲婷婷五月天| 久色激情| 99在线资源| 激情九九这里只有精品| 五月婷婷狠狠干| 第2色五月婷| 久久99看免费| 第四色婷婷丁香五月| 亚洲成人色五月天| 日本美女天天日天天爽| 精品无码色欲AV| 亚洲啪视频| 五月天大香蕉AV| 欧亚成人A片一区二区| 五月丁香五月综合欧美| 丁香五月综合| 久久精彩免费视频| 九九99九九精品免费| 五月婷婷六月天| 欧美大香蕉视频| 亚洲另类视频| 九色视频91疯狂| 久久久婷婷五月亚洲97号色| 99热精品在这里| 狠狠做六月爱婷婷综合aⅴ| 婷婷五月天六点丁香五月| 婷婷五月六月| 五月久久婷婷天堂视频| 五月丁香狠狠爱| 丁香婷婷网| 亚洲婷婷久久综合| 日本黄色在线观看| 青草青草久热这里只有精品| 色99视| www.日本久久videos| 久久久99视频| 精品综合久久久久久五月天| 欧美激情凹凸丁香网| 婷婷色爱| 日本精品99| 九九热视频免费的| 69超碰在线| 日本激情综合| 夜色五月天| 一本婷婷丁香久久| 无码动漫av| 97干在线播放| 青青草搞屄视频网站| 美女五月天婷婷| 欧美又粗又大一区二区在线观看| 五月丁香婷婷中文网| 五月丁香六月综合情在线观看 | 1024亚洲| 另类图片天天影视在线观看| 深爱五月亚洲| 97色永久免费视频| 99热这里有精品| 色吧婷婷五月亚洲| 色婷婷综合影院| 99超级碰碰| 婷婷五月综合色中文字幕| 9精品视频在线| 五月丁香激情综合网| 综合激情伊人影视在线| 国语精品探花| 99热网站| 婷婷黄色网| 超碰在线观看成人视| 五月婷婷影| wWwCom夜操wwW| 无码G高清天| 天天插AV丝袜中| 99热资源在线| 久久您您综合网| 九色在线观看91av| 婷婷成人丁香色情基地30 | 激情综合网,五月| www.av骚货| www夜夜| 中文字幕在线免费观看视频| 精品9l九九九九九77777| 五月婷婷激情日本| 热九九精品| 婷婷深爱色五月| 久久综合五月| 亚洲欧美在线观看| www.婷婷五月| 丁香久久| 久久五月婷6 9| 在线成人av播放| 激情五月婷婷丁香六月| 伊人五月天| 综合网色| 99久久精| 色热久| 九九99九九精品免费 | 成人色五月天| 淫视馆aV二区一区| 国产亚洲色婷婷久久99精品9j| 色情婷婷| 亚洲精品成人| 色综合色色色色| oumeisesewang| 亚洲最大视频| 丁香网站| 在线va网站| 婷婷丁香色五月| 97碰在线视频| 91一起操| 91人妻人人做人碰人人爽九色| 久热re视频在线观看网站| 97丁香婷婷| 五月综合六月婷婷| 香蕉久久国产AV一区二区| 密乳Va| 五月中旬婷婷丁香六| www.色综合| 99视频日韩| xxxx五月| 97精品综合久久| 久久久免费图片视频| 99热青青草| 直接看的AV| 免费无码毛片一区二区A片| 九九五月天| 色宗合,宗合网| 三级三久久线久久99久目本WW| 人人操人| 综合网五月| 五月丁香六月综合图| 欧美婷婷六月丁香综合色连续高潮抽搐| 99色精品| 色婷婷婷婷| 丁香婷婷情色五月天| 激情文学综合婷婷五月天丁香花| 少妇丁香婷婷| 在线观看免费视频| 伊人超碰| 激情涩播| 深爱婷婷丁香五月激情| 久久久色情| 五月天激情Av| 激情五月天久久| 2020久久婷婷五月| 在线看的免费网站| 婷婷五月丁香久久| 真实熟女-91九色| 九九热这里只有国产精品| 亚洲综合色婷婷| 国产亚洲99久久精品| 日日色综合| 啪啪色激情五月天| 色丁香五月婷婷| 亚洲成人中文字幕| 激情99| 久婷婷婷| 91操人视频| xxxx五月激情| 久久中文网| 五月婷婷九月婷婷九月婷婷| 婷婷五月天丁香激情| 五月亭亭直播| 亚洲中文字幕av| 99啪啪| 丁香丁婷五月激情| 九九九九操逼| 五月天激情婷婷久久| 色婷婷色综合| 91色五月| 婷婷五月丁香五月天| 91操人人操| 丁香五月婷婷色播艳门照| 九月色婷婷综合亚洲| 四色五月婷婷在线观看| 久热中文字幕| 婷婷五月天成人| site:hcxsz888.com| 日日干夜夜干| 夜夜躁爽日| 男人天堂AV在线一区二区| 五月丁香色婷婷| 婷婷五月情| 色99色| 新激情五月开心五月婷婷五月丁香五月| 色色五月婷婷狠狠| 七七色色综合| 视频免费精品免费精品免费精品免费精品免费精品免费精品免费99 | 日本三级大片| 婷婷六月色情| 久久狠狠干| 亚洲综合另类| 色五月色综合| 色狠狠色综合久久久绯色AⅤ影视 大香蕉五月天婷婷丁香91 | 色宗合,宗合网| 国产JK精品白丝AV在线观看| 五月丁香六月婷婷欧美综合| 99免费热在线精品| 丁香五月色色婷| 色色五月天丁香| 五月天激情在线视频| 丁香深五月婷婷| 激情图片婷婷| 噜噜噜精品欧美成人在线观看| 超碰爱爱爱| www.婷婷五月| 色偷偷综合| 亚州精品色情无码A片| 婷婷五月天电影网| 激情婷婷五月| 丁香五月久久| 秋霞AV美国| 啪啪91| 97色色色色色| 激情亚洲五月| 国产99热| 婷婷精品综合| 影音先锋91视频| 九九色色| 五月丁香啪啪激情| 亚洲丁香婷婷丁香五月天激情| 六月亚洲婷婷6月中文字幕| 色五月天 丁香| 国产成人+综合亚洲+天堂| 国产成人精品一区二区三区视频| 人妻激情综合| 婷婷深爱五月| 五月婷在线视频免费播放| 日日干天天射| 婷婷五月天情色| 国产毛片精品一区二区色欲黄A片 国产人妻777人伦精品HD | 99在线视频资源| 99热个人在线| WWW.国产| 久久婷婷色| 51国精产品自偷自偷综合 | 99在线观看亚洲| 97操在线资源| 午夜激情久久| 久草免费福利视频| 综合久久影院| 五月婷婷影| 亚洲成人网址在线观看| 国产成人一区二区三区在线观看| 99色在线| 丁香五月激情综合| 久久婷.com| 欧美日韩一区二区三区四区| 5月丁香六月婷婷| 久久99这里| 婷婷精品在线| 嫩草视频在线观看| AV动漫不卡无码免费| 第四色色色色色丁香五月天 | 九九中文字幕九| 激情 久久 婷婷| 五月婷婷激情| 丁香五月激情综合| 精品一二三区久久AAA片| 人人摸人人搞| 激情网五月天| 亚洲色久| 玖玖色综合色| 熟妇国产| 九九99在线| 色九月综合| 婷婷丁香18| 香蕉久久国产AV一区二区| 婷婷五月丁香五月| 青草视频在线观看视频| 熟女人妻一区二区三区免费看| 亚洲精品视频在线| 免费无码毛片一区二区A片| 97人人操人人干| 综合激情婷婷| 婷婷五月激情欧美大胆视频| 色婷婷激情视频| 四川BBB搡BBB爽爽视频| 丁香亭亭激情四射| 黄色99热| 亚洲日比视频| 成人丁香五月婷| 激情五月天第四色| 综合五月丁香六月婷婷| 超碰精品在线| 六月婷婷狠狠色在线观看| 婷婷五月天成人动漫 | 99久久综合网| 婷婷五月天成人网| 久久丁香综合香蕉| 婷婷情色五月| 婷婷丁香五月91| 六月婷婷香蕉| 99热这里| 久久五月激情网| 丁香五月冃欧美| WWW,五月| 五月婷婷AV| www.狠狠| 免费观看2018www黄色操逼网站| 人人叉久| 最新热中文字幕| 丁香五月综合图片在线观看| 婷婷五月免费视频| 天天干,天天日| 精品无码久久久久久久久| 超极99精品| 十区AV| 99久久99九九九99九他书对| 激情五月com| 婷婷五月天亚洲| 久久伊人9| 色色网站| 综久久久| 丁香五月天电影| 天堂伊人干| www.99热精品99.com| 亚洲 视频 导航 一区| 色婷五月婷婷| jizzdr| 六月激情婷婷| 9l久久久视频| 99热20| 五月丁香婷婷AV| 色情五月综合婷婷| 狠狠色狠狠爱| 99re久热只有精品6在线直播| 99爱在线精品视频免费观看| 久色网| 超碰京东热av男人的天堂| 九九热中文| 无码人妻一区二区三区四区| 亚洲av成人在线| 精品一二三区久久AAA片| 激情久久丁香| 99热乎| 狠狠高潮精品亚洲1| 狠狠色综合网| 久久香蕉婷婷| 久久99热 这里有精品| 天天激情欧美美女| 婷婷五月激情中文字幕| 五月婷婷六月丁香首页| 五月婷婷精品视频| 第四色五月天| 98永久精品| WWW激情五月天| 26UUU欧美激情一区二区| 香蕉97碰碰碰欧美| 99这里有精品久久97| 五月天婷婷在线播放免费| 婷色五月天| 五月天之色情综合网| 丁香五月瑟瑟| 丁香五月在线播放| 久热9热| 日逼AV影音先锋男人资源站| 国产成人网| AV操操操| 伊人大香蕉毛片| 丁香五月天色综合| 亚洲五月天婷婷| 综合激情四射一theav| 侠女刀之记忆电影在线看免费| 九九大香蕉黄色影院| 做爰丰满少妇1313| www.99热视频在线观看| 狠狠草狠狠草| 超碰亚洲天堂| 综合久久97| 国产色香蕉精品五夜婷| 五月天婷婷丁香社区| 夜夜干 夜夜操| 国产精品视频免费看| 夜丁香综合| 精品成人在线| 777.色色| 丁香五月婷婷色播艳门照| 青青久久五月| 五月丁香色情| 婷婷五月精品中文字幕| 丁香五月天天| 伊人综合网站| 丁香五月在线播放| 色天天久婷婷| 丁香五月天网站| 涩涩涩五月天| 26uuu最新地址| 第四色婷婷日本| 爱iii做iiii日| 久久综合影院| 色操b| 在线99热| 97婷婷五月激情六月丁香伊人| 五月丁香啪啪网| 亚洲中文乱字字幕线在永久| 99re6热在线精品视频播放速度| 97视频.干com| 十月色综合| 久久五月天大美女| 99热久97| 91干网站| 激情小说五月天| 五月天色婷婷综合| 婷婷六月色情| 婷婷五月激情热播| 色色色婷婷五月| 欧美性生交A片免费看| 亚洲最大激情无码| 逼里香不卡| 亚洲第一色色色| 天天肏高清在线| 淫五月停停| 婷婷大香蕉| 色 色 色综合com| 激情五月综合视频| 九月婷婷久久久| 丁香五月婷婷少妇| 婷婷六月色| 久热超碰91| 69堂午夜视频最新地址| 婷婷午夜| 91综合在线视频| 国产女18毛片多18精品| 狠狠色色色| 色噜噜婷婷| 超碰在线成人| 色欲av伊人久久大香线蕉影院| 色色亚洲五月天| 色五月婷婷少妇人妻| 婷婷九九| 99操99| 狼人婷婷综合| 站长推荐无码播放| 大香蕉五月天婷婷丁香91| 去色色五月天| 九九99男女视频在线观看| 激情色五月天| 激情图片亚洲| 国产暴力强伦轩1区二区小说| 国产成人精品一区二三区熟女在线| Va另类视频| 欧美日本高清视频99| 激情五月激情综合网| 国产1区2区3区在线观| 97丨九色丨国产丨PORNY| 丁香五月婷婷影院| 久久婷婷六月天| 五月丁香在线观看国产| 激情五月天网站| 乱女乱妇熟女熟妇综合网站| 97成人丁香| 开心婷婷五月| 婷婷五月丁香激情色情| 九热免费视频| 67194线路二在线观看| 26uuu精品一区二区| 五月丁香六月婷婷综合网| 亚洲精品网址| 亚洲亚洲人成综合网络| 婷婷九月丁香| 日本噜噜色网| 91精品91久久久中77777久久玖玖九九| 五月天成人伊人| 亚洲第一综合| 翔田千里无码| 熟女色专区| 欧美色偷偷大香| 久久伦乱| 婷婷五月婷| 色黑鬼导航| 99九九中文字幕视频| 国产熟妇乱子伦hd| 五月天综合网| 欧洲毛片基地c区| 久久丁香九| 超碰色综合| 五月婷婷乱| 久久婷婷五月综合精品蜜芽| 婷婷五月成人社区| 色五月五月婷婷| 9月色婷婷| 婷婷香五月综合激情| 丁香五月亚洲激情婷婷射| 亚洲色婷婷五月天| av在线不卡播放| 五月丁香婷婷成人网| 日日操日日撸| 26uuuuuuuu国产| 99热这里只有精品21| 女婷久久| 亚洲欧洲国产精品| 国产精品人妻在线网址| 97久久超视频| 欧美日韩色色| 激情久久久| 日日综合网| 色六月婷婷| 日日操夜夜撸| 婷婷成人五月天| 婷婷操婷婷干婷婷射| 五月丁香花免费视频| 一本久久亚洲五月婷婷| 99热www.| 五月天六月天| 婷婷五月天亚洲天堂| 丁香婷婷五月天色综合| 婷婷五月天久久久| 婷婷香蕉| 性爱动图国产麻豆一区二区三区| 伊人五月天综合网| 色五月色五天色情网| 人人操91色| 996热re视频在线观看视频| 色婷婷狠狠久久综合五月| 无码激情AAAAA片-区区| 婷婷色影音天| 婷婷五月成人社区| 麻豆精品| 超碰男人色| 激情五月天福利| 国产免费av网站| 黄色短视频在线观看| 激情婷婷护士激情| 99视频91| 人人爱人人草| 中文毛片无遮挡高潮免费| 色色五月婷婷| 99热在线观看| 日韩av手机在线观看| 精品久久久91久久影视网| 九九无码AV| 日本在线观看99| 热99热久| 久久婷婷啪啪视频| 丁香五月花婷婷开心| 婷婷伊在线| 丁香五月激情婷婷视频| 久久这里只有国产| 五月天成人手机在线视频| 人妻尝试久久久久久久久久久久| 色青青视频| 操射国产日本| 久9免费视频| 99在线免费视频| 人妻人人操| 97色色视频| 亚洲超碰青涩| 欧美色色干| 91五月天| 天天免费成年人视频| 色婷婷五月亚洲| 超碰1999| 天天婷婷综合亚洲亚洲| 久久婷综| 久久免费操| 六月欧美综合色情| 精品久久66| 超碰com| 精品一二三区久久AAA片| 97luluse| 91九九| 日韩AV色色色| 色色狼人综合| 激情操逼婷婷| 久久伊人婷婷| 丁香五月激情无码视频| 超碰色色综合| 五月丁香六月激情| 免费黄色片子| 天天天天天久久久久久| 色吧综合网| 久操香蕉| 久久五月天精品视频| 亚洲bt丁香五月天婷婷激情小说| 噜噜在线| 密着浓厚中出乚交尾GvG935| 九九热视频99| 999影院成人在线影院| 丁香五月婷婷久久综合激情网 | 激情无码网| 人妻性爱| 人妻熟妇六区| 九久9精品| www。五月,com| 色婷婷综合网| 亚洲综合五月天| 97精品人人A片免费看| 九九av在线| 久久这里只有精品网| 色五月婷婷综合在线| 色www久视频| 久久HD| 色婷婷狠狠18| 狠狠综合| 婷婷激情中文综合| 久久这里有精品| 老师的粉嫩小又紧水又多A片视频| 丁香五月综合激情性爱 | 超碰av天堂| 天天檫天天爽| 99免费在线视频| 欧美天堂久久| 天天日夜夜拍| 婷婷五月天 丁香五月天 裸体| 欧美99视频| 欧美综合在线五月天色婷婷| 丁香五月综合| 二色av| 中文字幕丰满人妻无码专区| 在线免费观看激情视频| 五月天婷婷丁香花| 香蕉婷婷| 九九国产视频| 综合色激情| 国产精产国品一二三在观看| 六月丁香啪| 国产成人+综合亚洲+天堂| 色综合香蕉| 天天色激情| 婷婷色五月综合| 久久小视频免费| www.五月.com| 91操操| 五月婷婷色色色| 97黑人精品区| 开心婷婷五月中文字幕组| 精品亚洲国产成AV人片传媒| 成人色情五月天婷婷丁香| 超碰在线国产| wuyuedingxiang99| 婷婷五月天,影院| 婷婷五月六月| 婷婷五月激情网站| 精品色色| 色播五月天天| 色香蕉婷婷| 色五月婷婷天天操夜夜操| 婷婷在线中文字幕| 色丁香婷婷| 中文字幕人妻AV| 久机视频这只有精品| 色综合久久8| 五月天婷婷在线AN| 99免费偷拍视频| 俺去也五月天婷婷| 九九九九精品精| 色噜噜伊人| 色婷婷成人做爰A片免费看网站| 狠狠干五月天婷婷网| 开心五月天激情网| 五月丁香久久久日婷婷久久婷婷日| 99热久| 99在线看片| 天天综合网~91| 婷婷色正月| 久久99热网| 天天色域综合网| 99欧美三级视频| 日本色婷婷| 综合久久高清| 一区二区三区视频| WWW.桔色成人.COM| 激情婷婷综合网| 91视频一起草| 五月天婷亚洲天综合网综合 | 噜噜色五月| 性生活久久朋友人妻| a片在线免费观看一区| 操逼六区| 色综合天天网| 99九九免费精品| 激情婷婷丁香五月天| 第四色色六月色综合| 久久久久9久无码视频| 五月天四色房丁香亭亭| 激情AV| 日本不卡高字幕在线2019| 26uuu欧美宗合| 婷婷激情人妻| 99热综合色图| 五月丁香啪啪拍| www.韩日视频| 99热.com| 婷婷丁香五月激情图片| 殴美日韩成人| 公的粗大挺进了我的密道| 91AV视频| 丁香激情五月| 丁香婷婷视频| 五月丁香影院| 亚洲精级| 五月天婷婷爱| 丁香五月激情月| 丁香五月婷婷欧美激情-中文天堂最新版在线观看 | 91精品国产日韩91久久久久久国模| 色99日韩| 国精产品久久| 激情五月综合久久| 丁香五月久久| 色综合色综合网| 久9热在线视频| www婷婷色| 狠狠综合| 日本丁香五月| 五月婷婷m| 色婷婷精| 久久一级AV| 五月丁香激情综合网| 99免费热视频| 这里只有精品99视频| 久久999久久999久久999久久| 久操香蕉| 噼里啪啦在线观看免费完整版视频| 久久久精品人妻| 亚洲天堂AAA| 大香网伊人久久综合| 久久aaaaa| 五月久久丁香| 一本大道嫩草AV无码专区| 色情五月天丁香社区| 五月丁香六月婷婷亚洲视频| 五月丁香六月日逼| 丁香婷婷基地| 婷婷久久久久| g00d人体西西| 色网站9| AV在线不卡播放| 激情综合婷婷| 久青草影院| 人人摸人人操人人爽| 国产偷人妻精品一区| 婷婷五月天成人影片| wuyuedingxiang99| 国产亚洲在线| 大香蕉啪啪啪| 丁香婷婷六月天| 99色久| 五月丁香A片| 啪啪日热| 亚洲 在线 另类| 国产99久久久国产精品免费看| 亚洲成人综合在线| 亚洲在线操| 超碰猛烈的性猛交| 五月婷婷丁香五月婷婷丁香| 色五月激情五月开心五月| 天天高潮夜夜爽| 日撸夜撸日操| 婷婷五月天成人影片| 极品 少妇 内射| 九色91视频| 日本熟妇精品99| 色婷网| 91狠狠综合久久久| 超碰免费在线| 99精品视频网| 无码少妇高潮喷水A片免费| 欧美色婷婷| 五月婷婷啪啪| 国产av天堂| 国产精品久久久久久久久久| 欧美槡BBBB槡BBB少妇| 1024人妻| 日韩艹比| 婷婷丁香五月在线观看91| 久久性都花花世界成人免费视频 | 色五月av伊人| 国产精品色色色色| www.五月丁香av| 99视频在线精品免费观看2| 婷婷五月天激情五月天深爱五月天| 婷婷五月天另类网站| 婷婷色情六月| 五月丁香激情综合网| 精品久久99码| 丁香六月在线| 色婷婷影视| 4438亚洲欧美| 人操91在线| 婷婷 伊人 久久| 操碰97| 五月情综合| 丁香六月激情蜜桃| 久色资源| 色色免费网站| 香蕉久久av一区二区三区| 九色综合网| 成人免费视频一区| 欧美三级欧美一级| 99热 免费| 999热在线视频| 欧美丁香五月| 日韩色色视频| 超碰成人黄色网| 久久久噜噜噜www成人| 超碰免费人妻| 激情五月丁香色婷婷| 五月丁香龟婷婷| 五月丁香婷草| 成功精品影院| 丰满老熟妇BBBBB搡BBB| 九九九九九九毛片| 丁香五月天激情网址| 人人操A| 丁香激情五月| 丁香激情五月| 91九色欧美| 综合五月草| 成 人 色 色| 午夜激情综合| 天天做天天爱| 9 1在线视频| 97色色-99久久| 天天干天天叉| 五月丁香综合| 激情五月婷婷| 狠狠色色综合| 五月丁香色五月| 高清无码网址| 五月天伊人| 任你日视频| 青青久在线视频免费观看| 91天堂网综合| 日本人妻丁香婷婷久久寝取熟女五月| 岛国AV网| 桃色成人网| Av九九| 五月丁香青草综合啪啪| 无码人妻激情| 97人碰人操| 青青操avbb| 色婷婷久久| 国产精品色情AAAAA片软件| 欧美99视频| 色婷婷五月天堂资源| 99这里只有精品|v| 丁香五月婷婷婷桃花影院| 狠狠夜夜五月丁香| 婷婷色六月| 五月天婷婷久久视频| 99免费青青蜜臀| 思99热精品久久只有精品| 婷婷五月电影院| 婷婷五月丁香四射| 99小精品| 亚洲一区二区无遮挡A片| 尤物一区二区| 丁香婷婷综合精品六月初| 综合网五月| 婷婷五月激情欧美大胆视频| 激情五月丁香综合蜜桃| 日韩在线视频中文字幕| 五月深情久久| 激情黄色小说五月天| 综合一区二区三区| 久久婷婷五| 色婷婷色五月综合| 久久久久久久人妻| 婷婷伊人中文字幕| 99热爱爱干干日| 性爱激情小说AV五月丁香花| 欧美激情五月| 白人荫道BBWBBB大荫道| 五月天综合久久丁香91| 婷婷五月天综合网| 在线综合啪| 亚洲男人的天堂婷婷色五月| 97人妻碰碰中文无码久热丝袜| 在线日韩视频| 伊人久久大香网| 九九性爱网| 天天插综合| 激情AV| 热久久成人| 夜夜爽天天干| 久久九九爽| 97色色综合| 9有码中文| 99在线精品视频| 中文字幕婷婷在线| 五月天成人小说网| 日本欧美成人片AAAA| 婷丁香五月天| 能看的AV| 亚洲 激情 中文| 久久久久9| 99色看这里只有精品| 五月婷婷激情网| 一起草av| 五月婷婷在线视频| 丁香五月婷婷少妇| 99婷婷| 天天婷婷天天| 免费无码毛片一区二区A片| 一级片无码| 色五月视频,小说| 99ri网站在线观看| 欧美精品熟女一区二区| Y11111111111少妇电影院| 五月婷婷中文字幕| 色 五月 天 婷婷 丁香 九月| 精品久久人妻| WWW免费视频碰碰碰碰| 久久99网站| 九玖视频这里只有精品| 色色五月婷| 中文不卡一二三区| 狠狠爱丁香婷| 99热这里只有精品9| 五月丁香综合中文| 97干欧美| 五月婷婷av| 色综合色色| 婷婷五月天com| 搡BBBB搡BBB搡18| 中文不卡一二区| 国产高清av黄色看片| 99日这里只有精品| 丁香激情五月少妇| 99国产在线| 在线区区区| 成人五月丁香花| 日本五月天一页| 色婷婷AV在线| 99在线精品视频在线观看| 777久久综合视频| 无语停婷丁香网| 激情图片久久| 激情四射五月天偷偷看婷婷| 人人艹艹艹| 开心深爱激情网| 久久9久| 激情五月婷婷五月| 99思思热只有在这里看| 97精品自拍| 亚洲激情网| 色亭亭丁香五月天| a色色片| 天天做天天爽| 亚洲亚洲人成综合网络| 国产激情久久| 久久99网| 亚洲av| 亚洲婷婷五月天在线激情综合网| 五月婷婷成人| 国产精产国品一二三在观看| 婷婷丁香97| 色婷婷精品| 色婷婷色综合久久精品V| 亚洲AV免费在线| 五月天婷婷激情在线色图| 久久激情五月天| 日本三日本三级少妇三级66| 最新五月天婷婷影| 丁香六月在线| 五月婷视频在线观看| 色色色视频免费无码| 91色噜噜狠狠狠狠色综合| 91亚洲视频| 操射国产日本| 国产AV一区二区三区最新精品| 中文字幕在线播放视频| 99免费| 亚洲 欧洲 国产 伦综合| sewuyuejiqingwang| 激情综合一| se99热久久一本| 夜夜干夜夜操| 东京热五月婷婷| 五月天合网| 综合色色婷婷| 丁香花操逼| 五月丁香激情婷婷| 色五天综合| 久久九九蜜| 日韩在线观看网址| 五月丁香婷婷五月色| 天天干夜晚夜操| 91 九色 入口| 思思热视频| 天天操天天国产三级片处女学生妹| 婷婷五月丁香综合人妻| 91蝌蚪窝视频在线| 日韩成人精品一区久久久久| 99操| 婷婷丁香五月天小说| 无遮挡国产高潮视频免费观看| 性爱在线播放av| 国产精产国品一二三在观看| 激情合网婷婷| 91 影音先锋| 天天摸日日舔狠狠添婷婷婷| 操日本99| 婷婷婷婷色| 日噜噜色| 九九精品自拍| 婷婷五月天AV| 在线只有精品| 91avse| 五月天精品| 欧美丁香六月激情视频| 免费黄网不卡AV| 直接看的AV| 日韩AC在线免费观看| 99色亚洲| 五月丁香色婷婷色| 五月天啪啪视频| 99这里有精品视频3| 激情99| 久久婷婷五月天激情唯美| 蜜乳人妻一区二区三区| 国产精品电影网| 99综合视频| 欧美日本免费一道免费视频| 婷婷五月天激情五月天| 中文字幕性爱视频| 综合色播| 亚洲 小说 欧美 激情 另类| 亚洲韩国日产综合AV| 亚洲国产va| 99碰| 五月丁香婷婷综合网| 丁香婷婷人妻综合网| 99伊人婷婷在线| 色综合九九| 人妻内射麻豆视频| 丁香六月综合激| 久热超碰| 色色色色色色色色色999| 精品人妻在线| 五月婷在线| 开心激情网五月| 婷婷伊人| 久久婷婷午夜| 99视频网址| 激情五月丁香激情综合网| 亚州色综合| 天天艹夜夜艹| 丁香色五月天| 综合亚洲色色| jiujiuxiangjiaowang| 婷婷五月情| 天天谢天天操| 婷婷五月色| 久操香蕉| 丁香六月啪| 思思热AV| 综合五月天亚洲婷婷| 97自拍视频网| 大地9中文在线观看免费高清| 免费不卡狠操美女视频网| 久久五月丁香| 91操屁股| 中文字幕免费高清电视剧| 五月丁香综合激情| 久久婷婷五月天激情| 激情AV在线| 超级碰碰99| 96精品成人无码A片观看金桔| 99色精品| 国际国外精品欧洲南美洲专区无码不卡| 五月色网| 99小视频| 日韩按摩二区| 五月丁香六月激情视频| 9色在线| 欧美大片免费播放器| 亲子乱av一区二区三区的| 97超级碰碰碰| 激情五月综合第一页| 色丁香五月天射婷婷爱婷婷| 97激情五月天| 天天天日天天天干| 丁香五月区| 五月天婷婷综合网| 影音先锋五月婷婷| 综合色网站| WWW色综合| 婷婷天天日婷婷| 99热18| 精品一二三区久久AAA片| 91视频免费后入强操| 99热综合在线| 丁香六月天之亚州热女| 国产激情综合| 天天揷综合网| 玖玖婷婷色五月| 丁香婷婷人妻综合网| 噜噜狠狠色综无码久久合欧美| 色婷婷888| 岛国在线观看91| 91人人澡人人爽人人看| 丁香五月天激情综合网| 99热这里都是精品| 成人看片网站| 九月激情综合| 综合狠狠五月婷婷| 五月婷婷视频| 精品香蕉99久久久久网站 | 久久99网| 99碰在线视频| 欧美噜噜免费观看| 天天草比天天爽| 农村熟妇高潮精品A片| 久久婷婷夜| 色五月婷婷中文字幕| 91婷婷五月天嫩女| 99热啪啪| 91尤物九色在线| 五月丁香六月婷婷a v| 久久久99视频| 97涩婷婷婷婷基地| 五月天激情国产综合婷婷婷就去爱| 国产一级婬片毛片| 夜夜爱网站| 91九色超碰正在播放| 五月天激情久色| 99自拍视频在线| 一区二区乱视频码| 亚洲综合视频一下| 99超级碰免费视频| 伊人热在线大香蕉| www色婷婷久久综合久色| 天天噜| 久色大香蕉| 日日干夜夜撸夜夜骑| 五月天综合视频| 五月天激情开心网| 五月天色不卡| 秋霞AV淫| 亚洲视频图片婷婷五月| 久久精品99国产精品日本| 亚州第一A片| 丁香五月天激情小说| 激情五月婷婷综合| 99福利导航| 美女丁香五婷婷| 97人人操人人拍| 五月丁香av在线| 天天做天天爱天天爽| 久久激情五月婷婷| 深爱开心激情| 91fuliwang| 五月丁香六月婷婷综合伊人| 婷婷视频网| 欧美在线看| 五月婷婷激情综合av| 婷婷激情四射五月天| 韩国久久少妇视屏| 99这里只有精品视频| 99精品在线播放| 99精品视频偷拍| 色婷婷综合亚洲| 丁香五月六月综合激情| 色五月激情五月| 开心婷婷五月花| 色色五月天婷婷| av 一区三区四区| 激情五月综合| 亚洲一区二区无遮挡A片| A久久| 97偷拍在线视频| 26uuu精品一区二区| 国模狼狼| 亚洲小视频免费看| 色噜噜狠狠色综无码久久合欧美| www色色com| 五月亭亭开心网| 五月丁欧美| 婷婷射丁香| 日韩综合久久| 超碰免费成人| 五月天亚洲图片婷婷| 亚洲1区| 激情综合五月激情XXXX| 开心激情五月天网| 激情五月天色婷婷综合| 大香蕉久久婷婷| 天堂综合久| 91精品婷婷国产综合久久| 九九久久99精品免费观看www| 欧美在线视频99| 婷婷综合欧美| 五月天激情婷婷| 六月丁香五月激情网| 色吧婷婷五月亚洲| 五月天五月天激情网| 日本人妻操| 九九久久五月天| 五月丁香综合| 天天天天干| 五月丁香五月天现场视频| 欧美三级视频| 久久Xx| 亚洲激情四射| 亚洲精品字幕| 天天做天天爱天天玩夜夜爽 | 天天天添天天操| 成人美女网| 天天爱夜夜爽| 伊人久久中文网| 丁香五月成人社区| 韩国情人在线电视剧免费观看高清版全集 | 六月丁香婷婷色狠狠久久| 久久久91| 五月激情久久综合| 九热网站| www.婷婷五月天.com| 久热这里只有精品性色AV| 婷婷丁香五月综合| 成人丁香婷婷五月天| 超碰成人AV| 亚洲AV免费在线| 狠狠五月天婷婷激情网。| 婷婷精品综合| 日韩aaaaa| 婷婷精品综合| 强伦轩人妻一区二区电影| 国产精品美女久久久久AV超清 | 激情婷婷五月| 生活片五区| 久九男女天堂| 99这里都是精品6| 99亚色色色| 99干免费视频| 香蕉综合在线| www.五月天婷婷姐姐| 色综合久久之分久久| 夜夜操狠狠操| 日本不卡中文字幕| 日韩久久系列| 碰碰女|