Si noti che la base 4.7.0 ora ha un setEnv
in System.Environment
. Quindi per il presente o per il futuro prossimo è risolto.
Tuttavia, se questa funzione è necessaria nelle versioni < 4.7.0 (che è il mio caso attualmente), ho estratto anche da the commit that adds the feature le funzioni necessarie per farlo funzionare con una versione di base precedente.
Tuttavia ho seriamente perso la pazienza su questo e lo ha fatto piuttosto brutto ma funziona per me ...
Il pasticcio è che ci sono 3 funzioni per chiamare in un ambiente Windows: putenv
, SetEnvironmentVariableA
(ASCII) e SetEnvironmentVariableW
(widechar, utf16). La patch che è stata commessa alla base 4.7 lo fa automaticamente, ma ho fatto qualcosa di più brutto per mancanza di tempo (potrei ancora ripulirlo).
Ecco quello che ho:
setEnv_ :: String -> String -> IO()
setEnv_ key value = withCString key $ \k -> withCString value $ \v -> do
success <- c_SetEnvironmentVariable k v
unless success (throwGetLastError "setEnv")
putEnv :: String -> IO()
putEnv v = void (withCString v $ \vv -> c_putenv vv)
foreign import stdcall unsafe "windows.h SetEnvironmentVariableA"
c_SetEnvironmentVariable :: CString -> CString -> IO Bool
-- SetEnv_ :: String -> String -> IO()
-- SetEnv_ key value = withCWString key $ \k -> withCWString value $ \v -> do
-- success <- c_SetEnvironmentVariable k v
-- unless success (throwGetLastError "setEnv")
--
-- Foreign import stdcall unsafe "windows.h SetEnvironmentVariableW"
-- c_SetEnvironmentVariable :: LPTSTR -> LPTSTR -> IO Bool
foreign import ccall unsafe "putenv" c_putenv :: CString -> IO CInt
Ovviamente usano CPP
di mettere il tutto in una #ifdef
solo per le finestre. Come puoi vedere, ho il codice per la chiamata widechar, ma l'ho commentato al momento. Penso che per il mio caso d'uso sarebbe probabilmente sufficiente chiamare lo putenv
ma funziona così com'è. Quindi, ecco come lo chiamo io, allora:
setEnv_ "LANG" localeStr
putEnv $ "LANG=" ++ localeStr
Il mio problema è che sono in primo luogo un utente Linux a casa e non mi piace fare troppo lavoro sulle finestre a casa, e ho messo un sacco di energia per far funzionare correttamente questa e altre cose su Windows, e non riesco a portarmi a ripulire ulteriormente. Ma con questo codice e la patch originale dovresti farlo funzionare sulla base < 4.7 senza molti problemi.
fonte
2014-06-29 07:35:23
Si noti che base 4.7.0 ora ha un 'setEnv'. –
@EmmanuelTouzery: Fantastico. Potresti metterlo come risposta per una maggiore visibilità? Grazie. –